0

私は2つのテーブルを持っています:

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 の場合上記のクエリからその行を取得していません。メニュー内のすべての項目 (ページに接続されているものと接続されていないもの) を取得するにはどうすればよいですか?

4

3 に答える 3

1

コメントからのリクエスト:

テーブルから部分的または不完全な値を取得するには、「LEFT JOIN」を使用する必要があります。

この場合、通常の結合は 2 つのテーブル間の一致を検索します。いずれかのテーブルに id 0 がないため、一致を取得できず、行は選択されません。

一致が取得されない場合、LEFT JOIN (または適切な場合は RIGHT JOIN、どちらが「不完全な」テーブルであるかに基づいて) を使用すると、結果には一致しない行も含まれ、他のテーブルのすべてが NULL になります。値

于 2013-05-21T11:50:16.013 に答える
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 は、関数から削除できる削除したい場合に渡したい where 条件です。最後の 2 つのパラメーターは 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);
     }

于 2013-05-21T11:46:49.757 に答える