簡體   English   中英

Codeigniter 2.1-MySQL連接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM