web-dev-qa-db-ja.com

Yii:CDbCriteriaを使用してGROUPBYの前にBYを注文する方法は?

このようなクエリで:

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

ありがとう。

6
Puigcerber

かなり複雑なSQLクエリがある場合は、Active Recordに書き込むのではなく、SQLに保持することをお勧めします。はい、それはデータベースの移植性を制限しますが、おそらくこれらのクエリを調整する必要はなく、より単純で保守性の高いコードが常に優先されます。

5
deepwell

手遅れだと思います。私も同様の問題を抱えていたので、このようにアプローチしようとしています

$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を取得する場合は、モデルクラスに別のプロパティを追加するだけです。

11
peculiar