counterCache įrašų skaičiui saugoti
Imkime kaip pavyzdį užduočių valdymo (ToDo) aplikaciją ir norime sužinoti kiek kiekvienoje kategorijoje yra nebaigtų darbų.
-
CREATE TABLE IF NOT EXISTS `task_categories` (
-
`id` int(10) unsigned NOT NULL auto_increment,
-
`item_count` int(10) unsigned NOT NULL,
-
`name` varchar(32) NOT NULL,
-
`created` datetime NOT NULL,
-
PRIMARY KEY (`id`)
-
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-
-
CREATE TABLE IF NOT EXISTS `task_items` (
-
`id` int(10) unsigned NOT NULL auto_increment,
-
`task_category_id` int(10) unsigned NOT NULL,
-
`user_id` int(10) unsigned default NULL,
-
`name` varchar(128) NOT NULL,
-
`description` text NOT NULL,
-
`status` tinyint(3) unsigned NOT NULL,
-
`created` datetime NOT NULL,
-
PRIMARY KEY (`id`),
-
KEY `task_category_id` (`task_category_id`,`user_id`)
-
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Taigi, turime du modelius – TaskCategory ir TaskItem.:
-
class TaskItem extends AppModel {
-
var $name = 'TaskItem';
-
-
var $belongsTo = array(
-
'TaskCategory' => array(
-
'className' => 'TaskCategory',
-
'foreignKey' => 'task_category_id',
-
'counterCache' => 'items_count',
-
'counterScope' => 'status = 0'
-
)
-
);
-
}
-
class TaskCategory extends AppModel {
-
var $name = 'TaskCategory';
-
-
var $hasMany = array(
-
'TaskItem' => array(
-
'className' => 'TaskItem',
-
'foreignKey' => 'task_category_id',
-
'dependent' => true,
-
)
-
);
-
}
Šiuo atveju žiūrim į TaskItem modelyje ‘counterCache’ => ‘items_count’ ir ‘counterScope’ => ’status = 0′ nustatymus. Pirmasis nurodo lentelės lauką kur bus saugojamas įrašų kiekis, antrasis nurodo, jog skaičiuoti tik tuos, kada TaskItem.active lygus 0 (darbas neatliktas).
Viskas, nuo šiol nereiks atskirai skaičiuoti kiekvienos kategorijos neatliktų darbų kiekio papildomomis užklausomis bei funkcijomis. Tuo pačiu gauname optimizuotą sistemą.

2009.04.06


Prie šios temos visai dera ir šis “monstras”
http://bakery.cakephp.org/articles/view/aggregator-aggregatable-behaviors-if-you-think-that-you-need-a-group-by-statement