开发者

Codeigniter return result and row

In the Model class I use return $query->row(); to return single rows and return $query->result(); when returning multiple rows.

On a single page I have to return single rows and multiple rows from 2 separate tables.

Table users contains general information like the user name, full name, and email address. Table user_links contains links submitted by the respective user and has multiple rows for each user.

My query

        $this->db->select('*');
        $this->db->from('users');
        $this->db->join('user_links', "user_links.user_id = users.user_id");
        $this->db->where('users.user_id', $user_id);
        $this->db->where('user_links.user_id', $user_id);
        $query = $this->db->get();
        return $query->row(); 

In my controller I load the query in my view by

$data['row'] = $this->User_model->user_read($user_id);,

$user_id being the 3rd URL segment containing the unique user id.

Finally, in my view I retrieve rows by echo $row->first_name;

This works for single rows but how can I create a foreach loop for user links? The goal is to avoid loops for single rows and use them just for retr开发者_如何转开发ieving multiple rows.


This is psuedo code but you can probobly do something like this

    $this->db->select('*');
    $this->db->from('users');
    $this->db->join('user_links', "user_links.user_id = users.user_id");
    $this->db->where('users.user_id', $user_id);
    $this->db->where('user_links.user_id', $user_id);
    $query = $this->db->get();
    if ($query->num_rows() == 1)
    {
        return $query->row(); 
    }
    elseif ($query->num_rows() > 1)
    {
        return $query->result_array(); //This returns an array of results which you can whatever you need with it
    }
    else 
    {
         //Add some logic to handle if there are zero results
    }


If I understand your question correctly, you want to get both the user data as well as user_links data with a single query while avoiding iterating through it to get the user's data. While this may be possible using result_array, I would advise against it since you will get 0 results when there are no entries in user_links for that particular user.

My suggestion is that you use two queries, one to get the user from the user table, another to get user's links from user_links table. This will also help you avoid joins.


Hard to tell what you want.

You want a function that checks if you're passing a row() or a result() and treat them accordingly.

In my opinion your code would be easier to read (and maintain) if you just passed everything as a result(). And do check if the set is empty to show a nice message to the user.


Sounds like you're looking for some of the other features already provided by CI's Active Record: http://codeigniter.com/user_guide/database/results.html

For what you are doing it sounds like using the built in function result_array would work. You use it like so:

TAKEN FROM LINK ABOVE

$query = $this->db->query("YOUR QUERY");

foreach ($query->result_array() as $row)
{
   echo $row['title'];
   echo $row['name'];
   echo $row['body'];
}


You can just replace this line:

$this->db->join('user_links', "user_links.user_id = users.user_id");

With this one:

$this->db->join('user_links', "user_links.user_id = users.user_id", 'left outer');

Join in codeigniter uses INNER JOIN by default but in some cases if there is no data in user_links it returns nothing so u can use LEFT JOIN in your frame work CI it used like i mentioned above.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜