[英]Codeigniter 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();
}
這是我的問題-菜單中的項目可以與頁面連接,但也可以是單獨的(不與頁面連接)。 這意味着MENU表中的page_id可以為0。如果page_id為0,則無法從上面的查詢中獲取該行。 如何獲得菜單中的所有項目(已連接的項目和未與page連接的項目)?
您需要在->join()
添加join type
喜歡
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
根據評論的要求:
您需要使用“ LEFT JOIN”從表中檢索部分或不完整的值。
在這種情況下,常規聯接將查找兩個表之間的匹配項。 由於其中一張表中沒有id 0,因此無法檢索到匹配項,也不會選擇該行。
如果未檢索到匹配項,則使用LEFT JOIN(或適當時使用RIGHT JOIN,基於哪個是“不完整”表),結果還將包含不匹配的行,另一表的所有NULL值
從您的控制器在模型中調用此方法說您的模型名稱為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是要傳遞的where條件,如果要刪除,可以將其從函數中刪除。最后兩個參數是orderby
只需在要加入的模型中使用此功能
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); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.