2009-04-27 310 views
6

Ben PHP/MySQL ve CodeIgniter için süper yeni yeni .. Birçok MySQL tablolarda bilgi var. Ben masaları birincil anahtarlar $ değişkenine eşit olduğu JOIN ile almak istiyorum ... Bunu nasıl yapabilirim ve birincil anahtar alanı olmadan tüm alanları alabilirim ???CodeIgniter/PHP/MySQL: JOIN ile veri almak

Şimdi ne yapıyorum bu (sadece iki tablo burada katıldı) 'dir:

function getAll($id) { 

    $this->db->select('*'); 
    $this->db->from('movies'); 
    $this->db->join('posters', 'movies.id= posters.id'); 
    // WHERE id = $id ... goes here somehow... 
    $q = $this->db->get(); 

    if ($q->num_rows() == 1) { 
     $row = $q->row(); 
     $data = array(
       'id' => $row->id, 
       'title' => $row->title, 
       'year' => $row->year, 
       'runtime' => $row->runtime, 
       'plotoutline' => $row->plotoutline, 
       'poster_url' => $row->poster_url 
      ); 
    } 

    $q->free_result(); 
    return $data; 

id (PK), başlık, yıl, çalışma zamanı ve plotoutline birinci tablodan sütun ve poster_url bir alandır ikinci tablodan. İkinci tabloda, zaten sahip olmak istemediğim bir Kimlik (PK) sütunu da var.

cevap

21

Jon haklı. İşte bir örnek:

$this->db->select('movies.id, 
        movies.title, 
        movies.year, 
        movies.runtime as totaltime, 
        posters.poster_url'); 
$this->db->from('movies'); 
$this->db->join('posters', 'movies.id= posters.id'); 
$this->db->where('movies.id', $id); 
$q = $this->db->get(); 

Bu sahip nesneleri geri dönecek -> id -> unvanı, -> yıl, -> totalTime ve -> poster_url özellikleri. Verileri her satırdan almak için ek kod kullanmanıza gerek yoktur. Active kayıt sözdizimi biraz binlerden alırsa

, unutma sen aynı sonuçları tam SQL sorguları kullanmak ve alabilirsiniz:

$sql = "SELECT movies.id, 
     movies.title, 
     movies.year, 
     movies.runtime as totaltime, 
     posters.poster_url 
     FROM movies 
     INNER JOIN posters ON movies.id = posters.id 
     WHERE movies.id = ?" 

return $this->db->query($sql, array($id))->result(); 

Her iki form veri düzgün kaçtı sağlayacaktır.

CodeIgniter Active Record

Query Binding in CodeIgniter

+0

Bu şekilde? Verileri almak istediğim satırdaki kimliği nasıl belirleyebilirim? 'WHERE movies.id = $ id' gibi bir şey .. – Jonathan

+0

Yukarıda daha fazla bilgi ekledim. :) – GloryFish

+0

'Aktif Kayıt' ile regulal SQL kodu arasında bir performans farkı var mı ??? – Jonathan

4

Yıldız işareti tüm alanları döndürür. Bunların bir alt kümesini, yani yinelenen kimlik alanını oluşturan tüm alanları geri döndürmek için, yalnızca '*' kullanmak yerine istediğiniz sütunları listeleyebilirsiniz.

Yine de yıldız işaretini kullanmamanız iyi bir fikirdir. Uygulamanın geleceği için, birisi, ihtiyaçlarınızı artıracak ve sorgularınızı yavaşlatacak olan masaya geniş bir alan ekleyebilir.

1

Basitçe yöntem zincirleme ile koyun: İki tablo arasında birleştirme ve tüm sonuçlar doğru alacak

$this->db->select('*') 
     ->from('movies') 
     ->join('posters', 'movies.id= posters.id') 
     ->where('movies.id', $id) 
     ->get(); 
0
$this->db->select('*'); 
$this->db->from('blogs'); 
$this->db->join('comments', 'comments.id = blogs.id'); 
$query = $this->db->get();