最近、CakePHPを書く仕事でjoinを使うことが多くなりました。でも、joinにも種類があって、inner join と left join をよく使っていますが、仕事始めたての頃はその違いを認識できていませんでした。最近になってようやくその違いがわかり、その重要性もある程度分かるようになってきました。今回はそのことの復習の意味もこめて、2種類のjoinについてまとめておきたいと思います。
[Main] ------------------------ id color user_id ------------------------ 1 red 001 2 green 002 3 blue 003 4 white 004 5 black 005 ------------------------ [User] -------------- id name -------------- 001 taro 002 jiro 003 saburo --------------
データベースが上記MainとUserの2つがあり、これらをinner join 、left joinで結合するときのコードと結果はそれぞれ以下になります。
○inner joinの場合
$params = array(
'fields' => array(
'Main.id',
'Main.color',
'User.name',
),
'joins' => array(
array(
'type' => 'inner',
'table' => 'users',
'alias' => 'User',
'conditions' => 'Main.user_id = User.id'
),
),
);
$result = $this->find('all', $params);
【 結果 】 ------------------------------ Main.id Main.color User.name ------------------------------ 1 red taro 2 green jiro 3 blue saburo ------------------------------
○left joinの場合
$params = array(
'fields' => array(
'Main.id',
'Main.color',
'User.name',
),
'joins' => array(
array(
'type' => 'left',
'table' => 'users',
'alias' => 'User',
'conditions' => 'Main.user_id = User.id'
),
),
);
$result = $this->find('all', $params);
【 結果 】 ------------------------------ Main.id Main.color User.name ------------------------------ 1 red taro 2 green jiro 3 blue saburo 4 white NULL 5 black NULL ------------------------------
NULLを許してでもそのレコードを表示するかどうかというところが違いになります。
しっかり使い分けてコードを書けるようになっていきたいです。