2012-03-30 13 views
5

Với một truy vấn như thế này:Yii: làm thế nào để đặt hàng trước khi GROUP BY với CDbCriteria?

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; 

tôi biết làm thế nào để làm điều đó bằng 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)); 

Nhưng tôi đã tự hỏi nếu có cách nào để làm bằng CDbCriteria nguyên nhân này, các mã sau đây , tất nhiên, không hoạt động:

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

Cảm ơn.

+0

Điều này có hữu ích không? http://stackoverflow.com/questions/8467698/sub-queries-activerecord-yii –

+0

Thú vị, vì vậy việc đọc liên kết đó có vẻ không thể thực hiện được bằng CDbCriteria. Cảm ơn! – Puigcerber

Trả lời

6

Nếu bạn có một truy vấn SQL phức tạp, cách tốt nhất là giữ nó trong SQL thay vì viết nó trong Active Record. Có nó giới hạn tính di động của cơ sở dữ liệu, nhưng bạn có thể không có một chuỗi các truy vấn này, và mã đơn giản hơn và dễ bảo trì hơn luôn thắng.

+1

Vì vậy, có vẻ như nó không thể làm điều đó bằng cách sử dụng CDbCriteria và đây là câu trả lời duy nhất, tôi chấp nhận nó. Cảm ơn. – Puigcerber

+0

FWs, đặc biệt là Yii (tôi đang làm việc với nó trong công ty) có nhiều sự không thoải mái như Mô hình có lỗi, phiên trong Yii, chẳng hạn, không thể lưu các giá trị trong mảng đa chiều kết hợp. Đó là lý do tại sao tôi thiết lập một điểm hoặc. –

+2

Câu hỏi không phải là cách thực hành tốt nhất cho truy vấn sql phức tạp. –

10

Tôi biết đã quá muộn. Tôi có vấn đề tương tự và tôi cố gắng tiếp cận như thế này

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

Nó giải quyết được vấn đề của tôi. Nếu bạn muốn truy xuất max_added_on, bạn chỉ cần thêm một thuộc tính khác trên lớp mô hình.