CakePHPでアソシエーション先のフィールドを検索対象に含めたい場合


コントローラー内でfind()検索するとき、対象のテーブルだけではなく、hasManyなどのアソシエーションでつながっている先のテーブルのフィールドを検索したいことがある。

この場合、単純に

find('all',array('conditions'=>array(
'対象テーブル.id '=>"%{$this->data['対象テーブル']['title']}%",
'対象テーブル'.'関連テーブル'.id like '=>"%{$this->data['対象テーブル']['title']")));

とやって、できるかなーと思っても機能しない(><)。。

で、それを回避するためにいったん、アソシエーション先のテーブルを検索してその結果のidを、find('list')で保持しておき、それを検索結果に含める、という段階をとる。

$id_list = $this->対象テーブル->関連テーブル->find('list', array('fields'=>'関連テーブル.id',
'conditions'=> array('関連テーブル.title like '=>"%{$this->data['対象テーブル']['title']}%")));


とし、前述のfindの対象に追加する

find('all',array('conditions'=>array(
'対象テーブル.id '=>"%{$this->data['対象テーブル']['title']}%",
'対象テーブル.id' => array_keys($id_list)
)


なるほど。。