2009-04-27 17 views
6

Sono nuovo a PHP/MySQL e super-nuovo a CodeIgniter .. Ho informazioni in molte tabelle MySQL. Voglio recuperarlo con JOIN dove le tabelle chiavi primarie sono uguali a $ variabile ... Come posso farlo e ottenere tutti i campi senza il campo chiave primaria ???CodeIgniter/PHP/MySQL: recupero dati con JOIN

Quello che sto facendo ora è questo (solo due tavoli è entrato qui):

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), titolo, anno, tempo di esecuzione e plotoutline sono le colonne della prima tabella e poster_url è un campo dal secondo tavolo. La seconda tabella contiene anche una colonna ID (PK) che non desidero recuperare perché ne ho già.

risposta

21

Jon ha ragione. Ecco un esempio:

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

Ciò restituirà gli oggetti che hanno -> id, -> titolo, -> anno, -> totalTime, e - immobili> poster_url. Non è necessario il codice aggiuntivo per recuperare i dati da ciascuna riga.

Non dimenticare, se la sintassi Active Record diventa un po 'ingombrante, è possibile utilizzare le query SQL pieno e ottenere gli stessi risultati:

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

Entrambe le forme farà in modo che i dati siano correttamente sfuggito.

CodeIgniter Active Record

Query Binding in CodeIgniter

+0

In questo modo mi unirò tra le due tabelle e ottenere tutti i risultati giusto? Come posso specificare l'ID dalla riga in cui voglio ottenere i dati ?? Qualcosa come "WHERE movies.id = $ id" .. – Jonathan

+0

Ho aggiunto alcune informazioni in alto. :) – GloryFish

+0

Esiste una differenza di prestazioni tra "Active Record" e il codice SQL regolare ??? – Jonathan

4

Un asterisco restituisce tutti i campi. Per restituire un sottoinsieme di questi, cioè tutti i campi separati dal campo ID ripetuto, è sufficiente elencare le colonne di cui si richiede piuttosto che usare '*'.

È spesso una buona idea non utilizzare l'asterisco in ogni caso. Nel futuro dell'app, qualcuno potrebbe aggiungere un grande campo alla tabella che sarà in eccesso alle tue esigenze e rallenterà le tue query.

1

In poche parole con il metodo del concatenamento:

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