2013-05-21 68 views
0

我有两个表:笨2.1 - MySQL的JOIN

MENU 
->id_menu 
->title 
->page_id 
->order 

PAGES 
->id_page 
->title 
->page 
->slug 

这是选择功能:

public function get_all_menu() 
    { 
     return $this->db 
     ->select('menu.*, pages.id_page, pages.title AS page_title') 
     ->from($this->table) 
     ->join('pages','id_page = page_id') 
     ->order_by($this->order_by) 
     ->get() 
     ->result_array(); 
    } 

这里是我的问题 - 在菜单项可以通过网页进行连接,而且它可以独奏(不连接到页面)。这意味着page_idMENU表可以为0.如果page_id为0,我没有从上面的查询获取该行。如何获取菜单中的所有项目(连接的项目和未连接页面的项目)?

+2

左连接是方式 –

+0

使用自定义查询与'LEFT OUTER JOIN' –

+0

@STTLCU它正在工作:)。如果你能写答案,那么我可以给你upvote :)。 – Sasha

回答

1

由于从意见中的要求:

您需要使用“LEFT JOIN”从表中检索部分或不完整的值。

在这种情况下,常规连接查看两个表之间的匹配。由于其中一个表中没有id 0,因此无法检索匹配并且该行不会被选中。

如果未检索到匹配,则使用LEFT JOIN(或在适当的情况下,根据哪个是“不完整”表),结果将包含不匹配的行,并且所有NULL在另一个表的值

+0

谢谢你帮我解释问题:) – Sasha

3

您需要添加join type->join()

public function get_all_menu() 
{ 
    return $this->db 
    ->select('menu.*, pages.id_page, pages.title AS page_title') 
    ->from($this->table) 
    ->join('pages','id_page = page_id','left') 
    ->order_by($this->order_by) 
    ->get() 
    ->result_array(); 
} 

参见参考手册Active Record

0

从您的控制器调用此方法在模型假设您的型号名称是general_model

$value=('menu.*, pages.id_page, pages.title AS page_title'); 
     $joins = array 
     (
       array 
       (
        'table' => 'pages', 
        'condition' => 'menu.id_page = pages.page_id', 
        'jointype' => 'leftouter' 
       ), 

     ); 
$where_condition=array('menu.Id '=>'Enable','restaurant.Id'=>$rest_id); 
      $data['detail'] = $this->general_model->get_joins('menu',$value,$joins,$where_condition,'menu.Id','asc')->result(); 

这里$ where_condition是你想要的地方通过如果u想删除就可以从功能,删除它,最后两个参数是排序依据

只需在模型中使用此功能对于加入

public function get_joins($table,$value,$joins,$where,$order_by,$order) 
    { 
     $this->db->select($value); 
     if (is_array($joins) && count($joins) > 0) 
      { 
      foreach($joins as $k => $v) 
       { 
       $this->db->join($v['table'], $v['condition'], $v['jointype']); 
       } 
      } 
     $this->db->order_by($order_by,$order); 
     $this->db->where($where); 
     return $this->db->get($table); 
    }