codeigniter活动记录左连接

时间:2014-05-06 05:22:36

标签: php codeigniter activerecord left-join

我有3个mysql表。

Table 1 user  
id | name  

Table 2 emails  
id | email  

Table 3 user_email  
user_id | email_id  

我没有查询多表的经验 使用codeigniter活动记录,我想根据用户ID找出用户的电子邮件地址,请告知以下代码是否正确?

$CI->db->select('email');
$CI->db->from('emails');
$CI->db->where('id', $userid);
$CI->db->join('user_email', 'user_email.user_id = emails.id', 'left');
$query = $CI->db->get();  

2 个答案:

答案 0 :(得分:47)

您有错误的where子句需要比较您的表格中的user_id,您要将电子邮件的ID与提供的$user_id进行比较

$CI->db->select('email');
$CI->db->from('emails');
$CI->db->where('user_id', $userid);
$CI->db->join('user_email', 'user_email.user_id = emails.id', 'left');
$query = $CI->db->get(); 

更有用的方法是为表提供别名,以便具有相同列的表不会有任何混淆

$CI->db->select('e.email');
$CI->db->from('emails e');
$CI->db->join('user_email ue', 'ue.user_id = e.id', 'left');
$CI->db->where('ue.user_id', $userid);
$query = $CI->db->get(); 

答案 1 :(得分:0)

@m khalid的答案是正确的,但是我创建了一个动态函数来实现与多个表的连接。检查一下。

function join_records($table, $joins, $where = false, $select = '*', $orderBy = false, $direction = 'DESC'){
  $CI->select($select);
  $CI->from($table);
  foreach($joins as $join){
    $CI->join($join[0], $join[1], $join[2]);
  }
  if($where) $CI->where($where);
  if($orderBy) $CI->order_by($orderBy, $direction);
  $query = $CI->get();
  return $query->result_array();
}


将您的问题应用于此。

$table = 'emails';

$joins[0][0] = 'user_email';
$joins[0][1] = 'user_email.user_id = emails.id';
$joins[0][2] = 'left';

$where['user_id'] = $userid;

您可以添加更多的联接,例如$ join 1 [0]。 如果需要选择一些特定的列,则可以按以下方式定义 $ select ='table1.column1,table1.column2,table2.column1,table2.column2' 或者,如果您希望所有列都放一个*

$this->join_records($table, $joins, $where, $select);

You may also find it here.