使用virtualField根据父ID获取SUM

时间:2011-11-23 10:24:20

标签: cakephp model cakephp-1.3 sum

我有一个位置模型和一个事件模型

我想获得每个位置的所有事件的总和

我认为我可以通过以下额外模型来实现这一目标:

<?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的总数。

我该如何纠正这个?

1 个答案:

答案 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将自动递增/递减。