これはみんなは知ってることなんだろうなぁと思いつつPOST。
僕は少々気付くのに時間がかかりました。
問題
paginateでbindModelしてもうまくいきません (><)
回答
paginateでbindModelを使うときはbindModelの引数にfalseを渡しましょう
$this->Model->bindModel($bind, false);
$this->paginate = array(
"Model" => array(
"conditions" => $conditions,
"limit" => 30,
"order" => array("Model.created" => "ASC"),
),
);
$lists = $this->paginate("Model");
解説
bindModelの第2引数はクエリを投げた後にbindをリセットするかどうかのフラグで、デフォルトはtrueになっています。
paginateでデータを取得する場合、最初にデータ数をカウントするクエリを投げるので*1 カウントではbindされているのですが、2度目のデータ取得ではbindが外れてしまうことが原因でした。
bindModelの第2引数にfalseを渡すと、その処理においてはbindの設定が持続しますのでカウントした後のデータ取得でもちゃんとアソシエーションが維持されると言うわけです。
- データ数/limitでページ数を算出したりするためでしょう。 [↩]