在Model类中,我使用return $query->row();
返回单行,并在返回多行时使用return $query->result();
。
在单个页面上,我必须从2个单独的表中返回单行和多行。
表users
包含一般信息,例如用户名,全名和电子邮件地址。
表user_links
包含相应用户提交的链接,每个用户都有多行。
我的查询
$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();
在我的控制器中,我通过
在我的视图中加载查询 $data['row'] = $this->User_model->user_read($user_id);
,
$user_id
是包含唯一用户ID的第3个网址段。
最后,在我看来,我按echo $row->first_name;
这适用于单行,但如何为用户链接创建foreach
循环?目标是避免单行循环,并仅将其用于检索多行。
答案 0 :(得分:5)
这是伪代码,但你可以做这样的事情
$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
}
答案 1 :(得分:2)
如果我正确理解您的问题,您希望通过单个查询同时获取用户数据和user_links数据,同时避免迭代它以获取用户的数据。虽然使用result_array可以实现这一点,但我建议不要使用它,因为当user_links中没有针对该特定用户的条目时,您将获得0结果。
我的建议是你使用两个查询,一个用于从用户表中获取用户,另一个用于从user_links表获取用户的链接。这也可以帮助您避免加入。
答案 2 :(得分:1)
很难说出你想要的东西。
您想要一个功能来检查您是否传递row()
或result()
并相应地对待它们。
在我看来,如果您只是将所有内容作为result()
传递,那么您的代码将更易于阅读(和维护)。并检查该集是否为空以向用户显示一条好消息。
答案 3 :(得分:1)
听起来您正在寻找CI的活动记录已经提供的一些其他功能:http://codeigniter.com/user_guide/database/results.html
对于你正在做的事情,听起来好像使用内置函数result_array会起作用。你这样使用它:
从上面的链接中获取
$query = $this->db->query("YOUR QUERY");
foreach ($query->result_array() as $row)
{
echo $row['title'];
echo $row['name'];
echo $row['body'];
}
答案 4 :(得分:0)
您可以直接替换此行:
$this->db->join('user_links', "user_links.user_id = users.user_id");
有了这个:
$this->db->join('user_links', "user_links.user_id = users.user_id", 'left outer');
默认情况下加入codeigniter使用INNER JOIN
但在某些情况下如果user_links
中没有数据则它不会返回任何内容,因此你可以在你使用的框架工作CI中使用LEFT JOIN
如上所述。