2009-04-27 12 views
6

Ich bin neu in PHP/MySQL und super-neu zu CodeIgniter .. Ich habe Informationen in vielen MySQL-Tabellen. Ich möchte es mit JOIN abrufen, wo die Tabellenprimärschlüssel gleich $ Variable sind ... Wie kann ich es tun und alle Felder ohne das Primärschlüsselfeld bekommen ???CodeIgniter/PHP/MySQL: Abrufen von Daten mit JOIN

Was ich tue, das ist jetzt (nur zwei Tische hier verbunden):

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), Titel, Jahr, Laufzeit und plotoutline sind Spalten aus der ersten Tabelle und poster_url ist ein Feld, aus der zweiten Tabelle. Die zweite Tabelle enthält auch eine ID (PK) -Spalte, die ich nicht abrufen möchte, weil ich sie bereits habe.

Antwort

21

Jon hat Recht. Hier ein Beispiel:

$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(); 

Diese Objekte zurück, die haben -> id, -> Titel -> Jahr -> totaltime und -> poster_url Eigenschaften. Sie benötigen den zusätzlichen Code nicht, um die Daten aus jeder Zeile abzurufen.

Vergessen Sie nicht, wenn die Active Record Syntax ein wenig unhandlich wird, können Sie die volle SQL-Abfragen und erhalten die gleichen Ergebnisse verwenden:

$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(); 

Beide Formen werden sicherstellen, dass Ihre Daten richtig maskiert sind.

CodeIgniter Active Record

Query Binding in CodeIgniter

+0

Auf diese Weise ich zwischen den beiden Tabellen beitreten und alle Ergebnisse richtig machen? Wie kann ich die ID aus der Zeile angeben, die ich die Daten erhalten möchte? Etwas wie 'WHERE movies.id = $ id' .. – Jonathan

+0

Ich habe einige weitere Informationen oben hinzugefügt. :) – GloryFish

+0

Gibt es einen Leistungsunterschied zwischen dem 'Active Record' und dem regularen SQL-Code ??? – Jonathan

4

Ein Sternchen gibt alle Felder zurück. Um eine Teilmenge von diesen zurückzugeben, d. H. Alle Felder sind von dem wiederholten ID-Feld getrennt, listet einfach die Spalten auf, die Sie benötigen, anstatt "*" zu verwenden.

Es ist oft eine gute Idee, asterisk nicht zu verwenden. In der Zukunft der App kann jemand der Tabelle ein großes Feld hinzufügen, das zu Ihren Anforderungen nicht ausreicht und Ihre Abfragen verlangsamt.

1

einfach mit der Methode Verkettungs setzen:

$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();