Yii: как ЗАКАЗАТЬ BY перед GROUP BY с CDbCriteria? - PullRequest
6 голосов
/ 30 марта 2012

С таким запросом:

SELECT * FROM (
    SELECT * FROM message ORDER BY added_on DESC
) as m WHERE receiver_id = 2 GROUP BY sender_id ORDER BY priority_id DESC;

Я знаю, как это сделать, используя findAllBySql:

$this->findAllBySql(
    'SELECT * FROM (
        SELECT * FROM message ORDER BY added_on DESC
     ) as m WHERE receiver_id = :receiverId 
     GROUP BY sender_id 
     ORDER BY priority_id DESC', 
     array('receiverId' => $userId));

Но мне было интересно, есть ли способ сделатьэто с использованием CDbCriteria , потому что следующий код, конечно, не работает:

$criteria = new CDbCriteria();
$criteria->condition = 'receiver_id = :receiverId';
$criteria->group = 'sender_id';
$criteria->order = 'priority_id DESC, added_on DESC';
$criteria->params = array('receiverId' => $userId);

Спасибо.

Ответы [ 2 ]

11 голосов
/ 07 октября 2012

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

$criteria = new CDbCriteria();
$criteria->select = '*, MAX(added_on) max_added_on';
$criteria->condition = 'receiver_id = :receiverId';
$criteria->group = 'sender_id';
$criteria->order = 'priority_id DESC, max_added_on DESC';
$criteria->params = array('receiverId' => $userId);

Это решило мою проблему. Если вы хотите получить max_added_on, вам просто нужно добавить другое свойство в класс модели.

5 голосов
/ 31 марта 2012

Если у вас довольно сложный SQL-запрос, лучше хранить его в SQL, а не записывать в Active Record.Да, это ограничивает переносимость базы данных, но у вас, вероятно, нет этих запросов, и всегда выигрывает более простой и обслуживаемый код.

...