[CakePHP]paginateではbindModelの第二引数にfalseが必要

[CakePHP1.2.3]

なんか、今開発中なのでしょうがないですが、最近CakePHPのネタばかり書いています。

今回は、コントローラ内でpaginateを呼び出す前にbindModelする際の注意点です。

通常では、paginateはモデル内で定義されたアソシエーションの設定通りにデータを取得します。
しかし、取得前に、bindModelやunbindModelでアソシエーションを一時的に変更することがあると思います。

例えば、Tagのidで絞り込んだArticleの一覧が欲しい場合があります。

そのような時は、以下のようにします。

[php]
//コントローラ内
$this->Article->bindModel(array(‘hasOne’ => array(‘ArticlesTag′)), false);
$this->paginate = array(
‘conditions’ => array(‘ArticlesTag.tag_id’ => $tag_id)
);
$articles = $this->paginate(‘Article’);
[/php]

一番上の、bindModelメソッドの第二引数にfalseを入れるのがミソです。これを入れないと正しく動作してくれません。
この第二引数は、モデルのfindメソッド実行後にモデル内のアソシエーション設定に戻すかどうかのフラグです。
falseを入れると、findメソッドが1回呼ばれた後でもbindした設定が有効になったままになります。

この設定が必要な理由は、pagination呼び出し時に件数を数えるfindと、データを取得するfind、計2回findメソッドが呼ばれるためです。こちらはなかなか気づきにくいところですので、お気をつけ下さい。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.