【问题标题】:Using virtualField to get SUM according to parent ID使用virtualField根据父ID获取SUM
【发布时间】:2011-11-23 10:24:19
【问题描述】:

我有一个 Location 模型和一个 Event 模型

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

我认为我可以通过使用以下额外模型来做到这一点:

<?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) 

因此,我不是每个位置的事件总和,而是第一行 匹配每个位置的所有事件的总和。

即:

        [Eventcount] => Array
            (
                [0] => Array
                    (
                        [location_id] => 7
                        [event_count] => 2
                    )

            )

event_count 旁边的数字 2 是数据库中事件的总数,而不是 location_id = 7 的总数。

我该如何解决这个问题?

【问题讨论】:

  • 看来我在某个地方需要一个 GROUP BY,但是如果我想在 find 中使用这个额外的模型,应该把它放在哪里->所有这些都在父级 hmmmmm 上完成......

标签: cakephp model cakephp-1.3 sum


【解决方案1】:

假设您的关系是某个位置有许多事件,我建议使用 counterCache 自动跟踪每个位置的事件数。来自counterCache page of 1.3 cookbook

模型不是通过 find('count') 手动计算记录,而是 本身跟踪对关联的 $hasMany 的任何添加/删除 模型并增加/减少内部的专用整数字段 父模型表。

因此,您需要向名为 event_count 的 Location 模型添加一个 int 列。在 Event 模型中,您需要在与 Location 的关系中添加一行:

var $belongsTo = array(
    'Location' => array(
        ...
        'counterCache' => true  // added to enable counter cache
    )
);

从那时起,当您为每个位置创建/删除事件时,位置模型中的 event_count 将自动递增/递减。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2023-03-08
    • 2019-06-23
    相关资源
    最近更新 更多