連結されていないデータを抽出
開発環境: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モデルのデータのみを抽出することができました。