views:

3321

answers:

2

Hi, I'm new to PHP/MySQL and super-new to CodeIgniter.. I have information in many MySQL tables. I want to retrieve it with JOIN where the tables primary keys are equal to $variable... How can I do it and get all the fields without the primary key field???

What I'm doing now is this (only two tables joined here):

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), title, year, runtime and plotoutline are columns from the first table and poster_url is a field from the second table. The second table also contains an ID (PK) column that I don't want to Retrieve because I already have.

+3  A: 

An asterisk will return all the fields. To return a subset of these, i.e. all fields apart form the repeated id field, simply list the columns which you require rather than use '*'.

It is often a good idea to not use asterisk anyway. In the future of the app, someone may add a large field to the table which will be surplus to your requirements, and will slow your queries.

Jon Winstanley
+7  A: 

Jon is right. Here's an example:

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

This will return objects that have ->id, ->title, ->year, ->totaltime, and ->poster_url properties. You won't need the additional code to fetch the data from each row.

Don't forget, if the Active Record syntax gets a little unwieldy, you can use full SQL queries and get the same results:

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

Both forms will ensure that your data is escaped properly.

CodeIgniter Active Record

Query Binding in CodeIgniter

GloryFish
This way I will join between the two tables and get all the results right? How can I specify the ID from tthe row I want to get the data?? Something like 'WHERE movies.id = $id'..
Jonathan
I've added some more info above. :)
GloryFish
Is there a performance difference between the 'Active Record' and the regulal SQL code???
Jonathan
In practice, I haven't noticed a significant difference. CI's Active Record is pretty lightweight. I tend to use AR for very simple queries anyways. As they get more complex I switch to straight sql for readability purposes. When in doubt, test it and know for sure. CI has some useful benchmarking functions that make that kind of testing easy to throw together: http://codeigniter.com/user_guide/libraries/benchmark.html
GloryFish