CakePHP - проблема с виртуальным полем с использованием Paginator?

Следующий SQL-запрос в phpMyAdmin возвращает именно то, что я ожидаю:

SELECT d.office_id, o.city, sum(d.`nb_followers`) as total_followers  FROM `data` as d
LEFT JOIN offices as o on d.office_id = o.id

WHERE d.`year` = 2014 AND d.`month` = 10 AND d.`day` = 01
Group by d.`office_id`
ORDER BY total_followers DESC limit 10

В моем контроллере:

 $this->Paginator->virtualFields = array(
            'followers' => 'SUM(Data.nb_followers)',
            'id' => 'Office.office_id'
        );


        $this->Paginator->settings = array(
            'fields' => array('id', 'Office.city', 'Data.followers'),
            'joins' => array(
                array(
                    'table' => 'data',
                    'alias' => 'Data',
                    'type' => 'inner',
                    'conditions' => array(
                        'Office.id = Data.office_id',
                        'year = ' . date('Y', mktime(0, 0, 0, date('m'), 1, date('Y'))),
                        'month = ' . date('m', mktime(0, 0, 0, date('m'), 1, date('Y'))),
                        'day = 01'
                    )
                )
            ),
            'group' => array('Data.id'), //Mal positionné à la base mais vérifier si activé n'impacte pas les résultats
            'order' => array('Data.followers' => 'desc')
            //'limit' => 1
        );
        $dataTop = $this->paginate('Office');

Но я получаю эту ошибку:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Data.followers' in 'field list'

SQL-запрос: ВЫБЕРИТЕ Office.id, Office.city, Data.followers ИЗ ebd.offices КАК Office внутреннее СОЕДИНЕНИЕ ebd.data КАК Data ВКЛ (Office.id = Data.office_id И год = 2014 И месяц = ​​10 И день = 01) ГДЕ 1 = 1 СГРУППИРОВАТЬ НА Data.id ПРЕДЕЛ 20

Нужна ваша помощь Спасибо


person Rjaibi Mejdi    schedule 29.10.2014    source источник
comment
Можешь попробовать поставить этот 'followers' => 'SUM(Data.nb_followers)' в настройках пагинатора в полях   -  person gmponos    schedule 29.10.2014
comment
Я уже пробовал это, но он не выполняет заказ   -  person Rjaibi Mejdi    schedule 29.10.2014


Ответы (1)


Я провел тест в своем веб-приложении и поместил виртуальное поле в одну из своих моделей. Виртуальное поле было полем из связанной таблицы и похоже, что оно не работает. Выдает ошибку sql. Итак, я вспомнил из документации команду подзапроса.

http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#sub-queries

Я не знаю, работает ли это, но я постараюсь дать вам пример, который может удовлетворить ваши потребности.

$db = $this->Office->getDataSource();

$subQuery = $db->buildStatement(
    array(
        'fields'     => array('followers' => 'SUM(Data.nb_followers)'),
        'table'      => 'datas',
        'alias'      => 'Data'
    ),
    $this->office);

$fields[] = $subQuery;
$fields[] = 'id';
$fields[] = 'Office.city';

Надеюсь, это направит вас в правильном направлении.

person gmponos    schedule 29.10.2014