Использование virtualField для получения SUM по родительскому идентификатору - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть модель местоположения, а также модель события

Я хочу получить СУММУ всех событий для каждого местоположения

Я думал, что смогу сделать это, имея следующую дополнительную модель:

<?php
class Eventcount extends AppModel {
    var $name = 'Eventcount';
    var $useTable = 'events';
    var $virtualFields = array(
        'event_count' => 'COUNT(*)'
    );  

}
?>

Это указывается по мере необходимости в модели Location.

Тем не менее, я думал, что это будет делать JOIN, используя WHERE Location.ID = Eventcount.location_ID, но это не так, вместо этого в коде отладки я получаю это:

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
                    )

            )

Число 2 рядом с event_count - это общее количество событий в базе данных, а не общее число, где location_id = 7.

Как я могу исправить это?

1 Ответ

0 голосов
/ 24 ноября 2011

Если ваши отношения связаны с тем, что в местоположении есть много событий, я бы предложил использовать counterCache для автоматического отслеживания количества событий в местоположении. Со страницы counterCache 1,3 поваренной книги :

Вместо подсчета записей вручную с помощью find ('count'), модель сам отслеживает любое добавление / удаление к связанному $ hasMany моделирует и увеличивает / уменьшает выделенное целое поле в пределах Таблица родительской модели.

Таким образом, вы добавили бы столбец int к модели Location под названием event_count. В модели Event вы добавили бы строку для отношения с Location:

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

С этого момента event_count в модели местоположения будет автоматически увеличиваться / уменьшаться при создании / удалении событий для каждого местоположения.

...