プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
CakePHP1.3系、find()でテーブルをjoinする
結論から書けば、find()の第二引数の配列の中に

'joins' => array(
                'type' => 'inner',
                'table' => 'JOIN_TBL1',
                'alias' => 'join_tbl1',
                'conditions' => array(
                    'tbl1.column1 = join_tbl1.column1',
                ),
            ),

とか付追加すればOKです。

多分、実際のコードを見た方が早いですよね(--?
というわけで、サンプルコードφ(--)

//テーブル結合
$joins = array(
    array(
        'type' => 'inner',
        'table' => 'JOIN_TBL1',
        'alias' => 'join_tbl1',
        'conditions' => array(
            'tbl1.column1 = join_tbl1.column1',
        ),
    ),
    array(
        'type' => 'left',
        'table' => 'JOIN_TBL2',
        'alias' => 'join_tbl2',
        'conditions' => array(
            'tbl1.column2 = join_tbl2.column2',
        ),
    ),
);


//検索条件
$conditions = array(
    'AND' => array(
        'tbl1.ID' => '100'
    ),
);

//取得項目
$fields = array(
    'tbl1.id',
    'join_tbl1.column1',
    'join_tbl2.column2',
);

//取得件数
$limit = 1000;

//並び順
$orderby = array(
    'tbl1.id',
);

// データ取得
$this->HogeModel->recursive = 0;
$hoge = $this->HogeModel->find('all', array(
                'fields' => $fields,
                'joins' => $joins,
                'conditions' => $conditions,
                'limit' => $limit,
                'order' => $orderby,
            )
);

それでは、少し細かく説明していきますね。

//テーブル結合
$joins = array(
    array(
        'type' => 'inner',
        'table' => 'JOIN_TBL1',
        'alias' => 'join_tbl1',
        'conditions' => array(
            'tbl1.column1 = join_tbl1.column1',
        ),
    ),
    array(
        'type' => 'left',
        'table' => 'JOIN_TBL2',
        'alias' => 'join_tbl2',
        'conditions' => array(
            'tbl1.column2 = join_tbl2.column2',
        ),
    ),
);

の部分がJOINするテーブルや結合条件を定義している部分です。

「type」は「inner」や「left」で指定します。
内部結合(INNER JOIN)か外部結合(LEFT OUTER JOIN)かの指定です。
「right」って書いて「RIGHT OUTER JOIN」になるかは確認していません。
あくまで個人的な考えですが、そもそもの話として
「RIGHT OUTER JOIN」は使わない方が良いと考えているので。
「LEFT OUTER JOIN」と「RIGHT OUTER JOIN」が混在しているSQL文なんて見た日にゃ~、
殺意を覚えますよ(-A-)

「table」は結合対象のテーブルです。
「alias」は結合対象のテーブルに付ける別名です。
「conditions」は結合条件です。

よって、全体をSQL文に書き換えると

FROM
    TBL1 as tbl1
INNER JOIN
    JOIN_TBL1 AS join_tbl1
ON
    tbl1.column1 = join_tbl1.column1
LEFT OUTER JOIN
    JOIN_TBL2 AS join_tbl2
ON
    tbl1.column2 = join_tbl2.column2

になります。

今回は3つのテーブル(tbl1にjon_tbl1とjon_tbl2)を結合しましたが、
配列の要素を増やすことで、3つでも4つでも結合できます。

あとは

$hoge = $this->HogeModel->find('all', array(
                'fields' => $fields,
                'joins' => $joins,
                'conditions' => $conditions,
                'limit' => $limit,
                'order' => $orderby,
            )
);

の部分の

'joins' => $joins,

で、実際に「結合してちょーだい」の指定をしています。

分かってしまえば、そんなに難しくはないですよね(--?

というわけで、find()におけるテーブル結合、完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:CakePHP1.3系  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事