cakephp_version:1.2.2.8120
ちょっとハマった。bindmodel()/unbindModel()を使って一時的にアソシエートしている時に注意。
<?php $this->paginate = array( 'A' => array( 'conditions' => array(), 'limit' => 20, 'order' => array('A.id' => 'desc'), 'joins' => array( array('type' => 'LEFT', 'alias' => 'B', 'table' => 'Bs', 'conditions' => 'A.id = B.A_id') )) );
こんな感じでJoinしたとしても、SELECT句で持ってきてくれるのは「A」というテーブルのデータだけで、Bのデータは取得してくれなかった。
joinする以上複数のテーブルに入っているデータが欲しいからjoinするに決まっているので、これは困った。
とりあえずこうやってみた。
<?php $assoc = array('B' => array('foriegnKey' =>"A_id","type"=>"LEFT")); $this->A->bindModel(array("belongsTo" =>$assoc));
そしたらよくわかんないエラーが出た。
かといって、bindModelする以外に道がなさそうなので、ぐぐってみた所、bindmodelには「reset = true」なる第2引数があってそれを指定すると良いという指摘があった。
paginateの際は、Modelに恒久的に定義してあるアソシエーションを元にControllerでメンバ変数として保持する流れになっていると見受けられる。一時的なアソシエーションをしてもそいつをcakeは汲み取ってくれないよ、ってことのようだ。ソース追ってないが、動きから判断するとそんな感じ。
つーわけで、
<?php $assoc = array('B' => array('foriegnKey' =>"A_id","type"=>"LEFT")); //resetしない! $this->A->bindModel(array("belongsTo" =>$assoc),false); $result = $this->paginate(); //unbindしたい時はこう $this->A->unbindModel(array("belongsTo" =>array("B")),false);
これでOK。
Modelのメンバ変数に$hasOneとかで定義している分にはコレでハマることは無いと思うけど、bindModel()/unbindModel()を駆使している場合はご注意。