CakePHPのモデルにあります便利な機能について紹介します。
– virtualFields
ブログのエントリーのテーブルがありまして、
カテゴリごとのエントリー数を取得する場合、
以下のfindを実行しますと、モデル名の配列に入りません。
$entry_ary = $this->Entry->find(“all”,
array(“fields” => array(“Entry.category_id”,
“Count(Entry.category) as count”),
“group” => array(“Entry.category”)));
$entry_aryの中身は下のようになります。
array(
(int) 0 => array(
‘Entry’ => array(
‘category’ => ‘1’
),
(int) 0 => array( // [0]の中に設定されます。
‘count’ => ‘5’
)
),
(int) 1 => array(
‘Entry’ => array(
‘category’ => ‘2’
),
(int) 0 => array(
‘count’ => ‘1’
)
)
)
virtualFieldsを利用しますと、[Entry]中にcountが設定されます。
$this->Entry->virtualFields[‘count’] = “COUNT(Entry.id)”;
$entry_ary = $this->Entry->find(“all”,
array(“fields” => array(“Entry.category_id”, “count”), “group” => array(“Entry.category_id”)));
$entry_aryの中身は下のようになります。
array(
(int) 0 => array(
‘Entry’ => array(
‘category_id’ => ‘1’,
‘count’ => ‘5’
)
),
(int) 1 => array(
‘Entry’ => array(
‘category_id’ => ‘2’,
‘count’ => ‘1’
)
)
)
– counterchache
ブログの各エントリーの閲覧者数など、
各レコードごとのhasManyの数を取得する場合、
「counterChache」の機能を利用しますととても便利です。
手順1.エントリーのテーブルに、閲覧者数用の列を追加します。
(閲覧履歴はLogというテーブルの場合、
「log_count」という列をエントリーのテーブルに追加します。
手順2. 閲覧者のログのテーブルにbelongsToの設定に「’counterCache’ => true」に追記します。
var $belongsTo = array(‘Entry’=> array(‘className’ => ‘Entry’,
‘foreignKey’ => ‘entry_id’,
‘exclusive’ => true,
‘counterCache’ => true));
以上の手順でエントリー(Entry)のモデルをfindしますと、
「log_count」に自動的に閲覧者数(hasManyの数)がカウントされます。