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)
)
なるほど。。