[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メソッドが呼ばれるためです。こちらはなかなか気づきにくいところですので、お気をつけ下さい。