読者です 読者をやめる 読者になる 読者になる

Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

cakephp1.2でpaginateで複数のModelを使いたい

CakePHP

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()を駆使している場合はご注意。