今回、記事の情報に、ユーザ情報とユーザプロフィールを合わせて取得したかった。
クエリ的には、以下が作りたかった。
SELECT Articles.*
FROM Articles
LEFT JOIN USER ON Articles.user_id = USER.id
INNER JOIN UserProfile ON USER.id = UserProfile.user_id
アソシエーション設定は、主に4つある。以下は、cakephp1.3のもの。
関係 | アソシエーション種別 | 例 |
---|---|---|
1 対 1 | hasOne | ユーザーは1つのプロフィールを 持っている。 |
1 対 多 | hasMany | ユーザーは複数の記事を 持つことができる。 |
多 対 1 | belongsTo | 多くの記事がユーザーに属している。 |
多 対 多 | hasAndBelongsToMany | タグは多くの記事に属している。 |
以下のように$joins変数を追加すればできた。
$joins = array(
array(
'type' => 'inner',
'table' => 'users',
'alias' => 'User',
'conditions' => array(
'User.id = Articles.user_id',
),
),
array(
'type' => 'inner',
'table' => 'user_profiles',
'alias' => 'UserProfile',
'conditions' => array(
'User.id = UserProfile.user_id',
),
),
);
$articles = $this->Articles->find('all', array(
'joins' => $joins,
));
あと、Modelクラスで設定したアソシエーション指定を以下で解除することができる。
$this->Articles->unbindModel(array(
'hasOne' => array('Category'),
'belongsTo' => array('Tags'),
), false);