[CakePHP1.3]アソシエーションでサブテーブル同士を連結したい

[CakePHP1.3]アソシエーションでサブテーブル同士を連結したい

今回、記事の情報に、ユーザ情報とユーザプロフィールを合わせて取得したかった。

クエリ的には、以下が作りたかった。

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 対 1hasOneユーザーは1つのプロフィールを
持っている。
1 対 多hasManyユーザーは複数の記事を
持つことができる。
多 対 1belongsTo多くの記事がユーザーに属している。
多 対 多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);

Web技術カテゴリの最新記事