我有一个位置模型和一个事件模型
我想获得每个位置的所有事件的总和
我认为我可以通过以下额外模型来实现这一目标:
<?php
class Eventcount extends AppModel {
var $name = 'Eventcount';
var $useTable = 'events';
var $virtualFields = array(
'event_count' => 'COUNT(*)'
);
}
?>
这在位置模型中根据需要引用。
但是我认为这会使用WHERE Location.ID = Eventcount.location_ID进行JOIN,但它没有,而是在调试代码中我得到了这个:
SELECT (COUNT(*)) AS `Eventcount__event_count`, `Eventcount`.`location_id` FROM `events` AS `Eventcount` WHERE `Eventcount`.`location_id` IN (6, 11, 13, 15, 7, 14, 4, 5, 10, 2, 9, 3, 1, 8)
因此,不是每个位置的事件的SUM,而是第一行的一行 匹配每个位置的所有事件的总和。
那是:
[Eventcount] => Array
(
[0] => Array
(
[location_id] => 7
[event_count] => 2
)
)
event_count旁边的数字2是数据库中事件的总数,而不是location_id = 7的总数。
我该如何纠正这个?
答案 0 :(得分:0)
假设您的关系是位置有多个事件,我建议使用 counterCache 自动跟踪每个位置的事件数。来自counterCache page of 1.3 cookbook:
不是通过find('count')手动计算记录,而是模型 本身跟踪对关联的$ hasMany的任何添加/删除 模型和增加/减少内部的专用整数字段 父模型表。
因此,您需要向名为int
的位置模型添加event_count
列。在事件模型中,您将为与位置的关系添加一行:
var $belongsTo = array(
'Location' => array(
...
'counterCache' => true // added to enable counter cache
)
);
从那时起,当您为每个位置创建/删除事件时,位置模型中的event_count
将自动递增/递减。