これはみんなは知ってることなんだろうなぁと思いつつ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でページ数を算出したりするためでしょう。 [↩]