CakePHPで各々のModelにアソシエーションを設定してて、
検索で使いたくないときはunbindModelを使うとはずせる。
Modelに定義してないけど、今回だけアソシエーションにしたい場合はbindModelで設定できる。
それは知っていたんだけど、unbindModelとbindModelを使用して、paginateを使用したら検索がうまくいかなかった。
$this->Model->unbindModel(array('hasOne'=>array('Model_2')));
$this->Model->bindModel(array('hasOne'=>array('Model_3')));
$result = $this->paginate('Model');
paginateはcountのSQLを実行した後、中身を取るSQLを実行してくれるんだけど、
ログを見たらcountのSQLには指定したunbindModelとbindModelは適用されてるのだけど、2回目のSQLにはされてなかった。
試しに2回unbindModelとbindModelを実行したらうまくいったよ。
// 2回Modelに設定してやる
$this->Model->unbindModel(array('hasOne'=>array('Model_2')));
$this->Model->bindModel(array('hasOne'=>array('Model_3')));
$this->Model->unbindModel(array('hasOne'=>array('Model_2')));
$this->Model->bindModel(array('hasOne'=>array('Model_3')));
$result = $this->paginate('Model');
しかし、絶対もっといい方法があるよなぁとか思いつつ、model.phpのソースをみたら、
function bindModel($params, $reset = true)
function unbindModel($params, $reset = true)
引数に$resetなるものが。
コメントはIf $reset is false, association will not be reset to the originals defined in the model
$resetにfalseを渡せばモデルで定義されたアソシエーションに戻りませんよって感じかな。
$this->Model->unbindModel(array('hasOne'=>array('Model_2')),false);
$this->Model->bindModel(array('hasOne'=>array('Model_3')),false);
$result = $this->paginate('Model');
結局、$resetにfalseを渡してあげたらうまくいった。
そりゃ当然想定されてるよね。
今までページネーションが必要な時に、bindModelとかを使用したことがなかったんだなぁ。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。