CakePHP: включить псевдоним поля под связанной моделью - PullRequest
2 голосов
/ 17 июля 2011

Я хочу сгруппировать результаты MySQL по столбцу, а также посчитать записи, относящиеся к той же категории:

$this->find('all', array(
    'fields' => array('UserCheckin.id', 'UserCheckin.capital_id', 'COUNT(UserCheckin.id) as capital_checkins'), 
    'group' => 'UserCheckin.capital_id'
));

Проблема в том, что capital_checkins сгруппирован как отдельный ключ в возвращаемом массиве, хотя я бы хотел, чтобы он соответствовал модели UserCheckin. Вот как возвращаются результаты:

Array
(
[0] => Array
    (
        [UserCheckin] => Array
            (
                [id] => 3
                [capital_id] => 10
            )

        [0] => Array
            (
                [capital_checkins] => 2
            )

        [Capital] => Array
            (
                [id] => 10
                [name] => London
            )

    )

[1] => Array
    (
       ...
    )

)

Есть ли способ включить псевдоним в UserCheckin модель?

Ответы [ 2 ]

3 голосов
/ 17 июля 2011

В cakephp 1.3 вы можете использовать виртуальное поле :

в вашей UserCheckin модели:

var $virtualFields = array(
    'capital_checkins' => 'COUNT(UserCheckin.id)'
);

ВАЖНОЕ ОБНОВЛЕНИЕ : как@Rob Wilkerson правильно замечает, что добавление виртуального поля с агрегатной функцией на постоянной основе в вашу модель [вероятно] испортит ваши find запросы, которые не имеют GROUP BY (неявно группируют все строки в MySQL или просто не работают с ошибкой SQL вSQL Server).Решение состоит в том, чтобы временно добавить виртуальное поле во время выполнения перед запросом, который его использует:

$this->virtualFields['capital_checkins'] = 'COUNT(UserCheckin.id)';

$result = $this->find('all', array(
    'fields' => array('UserCheckin.id', 'UserCheckin.capital_id', 'UserCheckin.capital_checkins'), 
    'group' => 'UserCheckin.capital_id'
));

//reset virtual field so it won't mess up subsequent finds
unset($this->virtualFields['capital_checkins']);

return $result;
0 голосов
/ 17 июня 2016
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...