質問: CakePHPのアソシエーションについての質問です。 モデルAから多対一の関係となるモデルBを取得する為にbelongsToのアソシエーションを設定 しておくと モデルAでfind()する際にconditionsに"モデルB.name"といった条件で絞り込みを書けますが モデルBと一対多の関係となるモデルCが有り、モデルB内でhasManyのアソシエーションを設定しておいても モデルAでfind()する際にconditionsに"モデルC.name"を指定するとエラー Column not found: 1054 Unknown column 'モデルC.name' in 'where clause' が発生してしまいます。 recursiveは2に設定していて、モデルCをconditionsに書かなければ検索結果に モデルCのカラムが含まれています。 モデルA側からモデルCのカラムを指定したconditionsを書きたいのですが そのような方法はありますでしょうか。
回答: Containable ビヘイビアをA,B,Cそれぞれのモデルに適用すると、比較的容易に階層が深いモデルについても絞り込みができるようになります。 ``` public $actsAs = array('Containable'); ``` 上記マニュアルページからサンプルコードを引用します。 ``` $this->User->find('all', array( 'contain' => array( 'Profile', 'Account' => array( 'AccountSummary' ), 'Post' => array( 'PostAttachment' => array( 'fields' => array('id', 'name'), 'PostAttachmentHistory' => array( 'HistoryNotes' => array( 'fields' => array('id', 'note') ) ) ), 'Tag' => array( 'conditions' => array('Tag.name LIKE' => '%happy%') ) ) ) )); ``` この例のモデル構成では `User` → `Post` → `Tag` という親子関係が発生していますが、`User`から見て孫になっている`Tag`モデルに対して `conditions` で抽出条件が記述されていることがわかるかと思います。 CakePHP 1.x 系でよければ和訳されたマニュアルもあります。 コンテイナブル — CakePHP Cookbook 1.3 ドキュメント 2.0系と大きく変わるところはないと思いますので理解のためには十分参考になるでしょう。