[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.