CakePHPのcounterCacheでhasManyの数を自動取得
hasManyの数を自動取得出来るcounterCacheが便利すぎる
GWなのに、お仕事してますよ ITかあさんです。先日教えてもらった
CakePHPのhasManyの数を取得する
のに、
counterCacheを使うと、増減毎にフィールドに自動保存してくれる
っていう便利な機能を教えてもらいました。
counterCacheはどういうところに使えるの?
例えばブログの記事投稿ってカテゴリーを指定しますね。あのような
このカテゴリーは何個の記事データを持っていますか?
っていうお前は一体何個hasManyしているんだ!っていうのが知りたい時に大変便利です。
CakePHPのcounterCacheの使い方
今回のModeの例
・Post 記事データが入る
・PostCategory CategoryとPostの紐付け
・Category カテゴリー(PostCategoryをhasManyしている)
・PostCategory CategoryとPostの紐付け
・Category カテゴリー(PostCategoryをhasManyしている)
このような構造で、今回はCategoryモデルにPostCategoryの数を保存する構造にします。
belongsToのModelに記述を追加するよ
var $belongsTo = array( "Category" => array( 'className'=>'Category', "counterCache" => true,//これだけ! 'foreignKey'=>'category_id' ), );
hasManyのModelにフィールドを追加
Category Modelに数値型でフィールドを追加します。
image_category_count
複数系にならず、hasManyのModelの名称(小文字)+_countとなります。
以上、終了!
たったこれだけで、ImageCategoryのデータが登録される度に、または削除される度にimage_category_countの数値が増減します。
DeleteAllでカウントがうまく取れない
で、ここまでの情報は出回っているものの、問題は一度に削除したり、一度にたくさん登録するケース。
この場合、DeleteAllなどたくさんの登録や削除が終わった段階で現在何件あるかを問い合わせすることで、カウントの値が変更されます。
updateCounterCacheで現在の件数を登録する
一度にたくさん登録した、たくさん削除した場合はそのままでは件数が更新されないためupdateCounterCacheをデータをたくさん登録したり削除した後に実行します。updateCounterCacheをしたタイミングで、その時の件数を数えてくれるイメージでしょうか。
$this->PostCategory->updateCounterCache(array('post_id' => $post['Post']['id'],'category_id' => $category_id));
queryした時も同様で、updateCounterCacheは1件ずつsaveやdeleteで増減した時でないと自動でカウントはしないみたいです。この時もupdateCounterCacheを実行してあげればいいみたいです。
うん、これで今データは何件あるかの管理は相当楽になりますね。