CakePHP1.2のcounterCache

Kazuya Takato

Kazuya Takato

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サイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。

Webサイト制作の実績・料金を見る

この記事のシェア数

1983年生まれ。SIerとしてのキャリアをスタートし、JavaやC#を中心に多岐にわたる開発プロジェクトにエンジニアとして参加。その経験を活かし、LIGを創業。バックエンドおよびフロントエンドエンジニアとしての深い知識と経験をもとに、多様なプロジェクトに従事。2023年7月には社長室室長に就任にし、社内の体制やルールの最適化、AI技術の推進など、経営戦略の一翼を担っています。

このメンバーの記事をもっと読む