2009-04-27 17 views
6

Soy nuevo en PHP/MySQL y súper nuevo en CodeIgniter .. Tengo información en muchas tablas MySQL. Quiero recuperarlo con JOIN, donde las claves primarias de las tablas son iguales a $ variable ... ¿Cómo puedo hacerlo y obtener todos los campos sin el campo de clave principal?CodeIgniter/PHP/MySQL: Recuperar datos con JOIN

Lo que estoy haciendo ahora es la siguiente (sólo dos mesas unió aquí):

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), título, año, tiempo de ejecución y plotoutline son las columnas de la primera tabla y poster_url es un campo de la segunda mesa. La segunda tabla también contiene una columna de ID (PK) que no quiero recuperar porque ya la tengo.

Respuesta

21

Jon tiene razón. He aquí un ejemplo:

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

Esto devolverá los objetos que tienen -> Identificación, -> título, -> años, -> totalTime, y - propiedades> poster_url. No necesitará el código adicional para obtener los datos de cada fila.

No se olvide, si la sintaxis de registro activo se hace un poco difícil de manejar, puede utilizar consultas SQL completos y obtener los mismos resultados:

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

Ambas formas se asegurará de que sus datos se escapó correctamente.

CodeIgniter Active Record

Query Binding in CodeIgniter

+0

De esta manera me uniré entre las dos tablas y obtener todos los resultados de la derecha? ¿Cómo puedo especificar la ID de la fila de donde quiero obtener la información? Algo como 'WHERE movies.id = $ id' .. – Jonathan

+0

He agregado algo de información más arriba. :) – GloryFish

+0

¿Hay una diferencia de rendimiento entre el 'Registro activo' y el código SQL regulal ??? – Jonathan

4

Un asterisco devolverá todos los campos. Para devolver un subconjunto de estos, es decir, todos los campos aparte del campo de identificación repetido, simplemente enumere las columnas que necesita en lugar de usar '*'.

A menudo es una buena idea no utilizar asterisco de todos modos. En el futuro de la aplicación, alguien puede agregar un campo grande a la tabla que será excedente a sus requisitos y ralentizará sus consultas.

1

En pocas palabras con el método de encadenamiento:

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