$belongsToを設定しておけばfindで関連するモデルのデータも取ってきてくれるわけですが。
例えば
class Foo extends AppModel {
var $name = "Foo";
var $belongsTo = array('Bar' =>
array('className' => 'Bar',
'conditions' => '',
'order' => '',
'fields' => array('hoge'),
'foreignKey'=>'bar_id'
)
);
}
って書いておけばFoosControllerで$this->Foo->findById(‘1’);とかやればidが1のデータと、そのデータ中のbar_idに対応するBarのデータも勝手に取ってきてくれる。(当然Fooはbar_idというフィールドを持つ)
この場合はfieldsを’hoge’に指定しているのでBarのhogeフィールドだけをとって来てくれる。
便利なんだけど常にとってきてしまうので鬱陶しいといえば鬱陶しい。
というわけで
var $recursive = -1;
ってモデルに定義しておけば普段はBarを取ってこない。とって来たいときは
$this->Foo->findAll(array('foofoo' => '1'), array('id', 'name', 'bar_id'), 'id DESC', 10, 1, 2);
ってやればよい。
最後の引数が$recursiveなんで1でいいんじゃないかと思ったんだけど2じゃないとだめだった。
上記で2番目の引数(fieldsの指定)で’bar_id’を指定しないとなぜかBarのデータを取得できないから要注意。
ちなみに1番目の引数は検索条件(’foofoo’が1のデータを取ってくる)、3番目の引数はオーダー(idで逆順)、4番目は取得数上限、5番目は取得開始ページ(4番目の引数である「取得数上限」単位で区切られる)。
さらに例えばFooのcreatedでソートしたいとき、
$this->Foo->findAll(array('foofoo' => '1'), array('id', 'name', 'bar_id'), 'created DESC', 10, 1, 2);
ってやると怒られる。Barの’created’と衝突するらしい。そういうわけで
$this->Foo->findAll(array('foofoo' => '1'), array('id', 'name', 'bar_id'), 'Foo.created DESC', 10, 1, 2);
って書かないといけなかった。
なかなかめんどくさい。
以上
Add Your Comment
コスミー報告書[社外秘] – CakePHPではまったこと17(belongsTo)