1.1にもあったのかもしれないけど、1.2はModelにcounterCacheって便利な機能がある。
modelがアソシエーションしてるときに、model名_countってカラムを用意しといて、
bindModelのときに’counterCache’ => trueを指定しとくと、勝手に数を数えて増減を登録してくれらしい。
詳しい説明はここにある。
使ってみたけど、たしかに便利。
でもこれを使ってると、bindModel($params, $reset = true)の$reset=falseが効かなくなるのね。
なので、うまくつかわないと$this->paginateが使えなくなっちゃうね。
※この記事参照
僕の書き方が悪かったんだけど、いきなり動かなくなるからあせった。
ソース読んでないからなんともいえないけど、両立する方法もあるのかな。
※追記
使いたいときだけ下記のようにmodel内でbindModelしてつかってた。
// model名_countをもつModelをバインドする
$this->bindModel(array('belongsTo'=>array('Model_blongsTo'=>array('className'=>'Model_blongsTo',
'foreignKey'=>'id',
'counterCache'=>true))));
// カウンターキャッシュが数えてくれるmodelをバインドする
$this->UserDetail->bindModel(array('hasMany'=>array('Model_hsMany'=>array('className'=>'Model_hsMany',
'foreignKey'=>'id'))));
で、save()の時はうまく動いてたんだけど、del()の時はうまく動かなかった。
modelのソースを見たら、下記のようにカウンターキャッシュのメソッド(updateCounterCache())を読んでた。
if (!empty($this->belongsTo)) {
$this->updateCounterCache($keys[$this->alias]);
}
del()の時は、delete分の前にselectを読んでるので、その時点でbindModelの情報がなくなってたみたい。
$this->belongsToが空になってた。
なので、
$this->bindModel(array('belongsTo'=>array('Model_blongsTo'=>array('className'=>'Model_blongsTo',
'foreignKey'=>'id',
'counterCache'=>true))),false);
としたら、うまくカウンターキャッシュが動いてくれた。
ほんとかどうか自信がないや。
使い方が間違ってるのかもしれない。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。