[CakePHP] hasAndBelongsToMany の関連テーブルの条件で絞り込み検索
CakePHP は基本的に SQL を直接書くことなくデータを取り扱いできますが、複雑な条件の絞り込み検索などは、簡単にいかないこともあります。
今回は嵌ったのは、hasAndBelongsToMany で関連づけられた Photos と Tags のテーブルがあり、特定のタグ名を持つ写真を検索するという場合。SQLなら簡単に書けるケースでも CakePHP だと戸惑ってしまいます。
例えば Photo と Tag という二つの Model を hasAndBelongsToMany (HABTMと略される)で結びつけます。このとき関係テーブルに対応する PhotosTag というモデルがあります。
この結びつきのままで conditions に Tag.Name => 'hoge' などと書いてもうまくいきません。
結局、hasAndBelongsToMany (HABTM) The Cookbookの記述を参考に Model の bindModel を使用することにしました。
$this->Photo->bindModel(array(
'hasOne' => array('PhotosTag',
'FilterTag' => array(
'className' => 'Tag',
'foreignKey' => false,
'conditions' => array('FilterTag.id = PhotosTag.tag_id')
)
)
)
);
$conditions = array('FilterTag.name' => $keyword);
$data = $this->find('all', array('conditions' => $conditions));
これで期待通りの動作となります。生成された SQL も期待通りのものです。
ちなみに同じことを実現する方法として、CakePHP 1.2 以降の コンテイナブルというものもあります。こちらの方が PHP のコード簡潔なのですが、生成される SQL が非常に非効率であり、格納されるデータの形も扱いづらかったので、採用に至りませんでした。
CakePHP はやりたいことを調べるのに結構時間がかかってしまいますが、こういったノウハウが蓄積されてくると開発スピードが上がりますね。
コメントはまだありません
No comments yet.
Sorry, the comment form is closed at this time.