連結されていないデータを抽出
開発環境:CakePHP2.5.1
通常、テーブルを連結してデータを取得するには、アソシエーションを利用しますが、連結をした時に、連結できていないデータだけを抽出したい場合があります。
その方法を見ていきましょう。
通常の連結
usersテーブルにprofilesテーブルが紐付いている状態を考えてみます。
まずは、Userモデルでアソシエーションの指定をします。
<?php
class User extends AppModel
{
public $hasOne = 'Profile';
}
これでUser.id=Profile_user_idが連結したデータが取得できます。
連結できていないデータの取得
それでは本題ですが、上記のサンプルの中に、Profileモデルのデータが空のものがいくつか出てきます。
ですので、上記で取得したデータをループで回して条件分岐させて連結できていないデータを取得するのも一つの方法ですが、あまりスマートではありません。
ではどうやってやるか。
joinsを使って更に条件を追加してあげることで、期待するデータのみを取得することができます。
<?php
$joins = array(
array(
'table' => 'profiles',
'alias' => 'Profile',
'type' => 'LEFT',
'conditions' => 'Profile.user_id = User.id'
),
);
$params = array(
'conditions' => array('Profile.id' => null),
'fields' => array(
'User.*',
'Profile.*',
),
'joins' => $joins,
);
$data = $this->User->find('all', $params);
これでProfileモデルと紐付かないUserモデルのデータのみを抽出することができました。
