2014-12-16 14 views
5

Tôi vẫn đang làm việc toàn bộ chức năng của CDbCriteria trong Yii 1.xx - Tôi có một truy vấn SQL khá phức tạp mà tôi muốn chuyển đổi sang sử dụng định dạng CDbCriteria với các truy vấn trong mô hình (nếu điều này là có thể với một truy vấn phức tạp hơn.Chuyển đổi truy vấn này sang định dạng CDbCriteria trong Yii

nỗ lực ban đầu của tôi lúc này ..

$criteria = new CDbCriteria; 
$criteria->select = array(
    't.classroom_id, title', 
    'COALESCE(COUNT(DISTINCT r.redeemed_code_id),0) AS totalRewards', 
    'COALESCE(COUNT(DISTINCT ocm.user_id),0) AS totalStudents', 
    'COALESCE(SUM(r.points),0) AS totalPoints' 
); 

bất cứ ai có thể đề xuất những cách tốt nhất để đi về vấn đề này bằng cách sử dụng truy vấn sau đây? Bất cứ lời khuyên được khuyến khích nhờ ..

SELECT 
    t.classroom_id, 
    title, 
    COALESCE (r.classRewards, 0) AS totalRewards, 
    COALESCE (r.classPoints, 0) AS totalPoints, 
    COALESCE (COUNT(DISTINCT ocm.user_id), 0) AS totalStudents 
FROM 
    organisation_classrooms t 
    LEFT JOIN (select crc.classroom_id, 
         COUNT(DISTINCT crc.redeemed_code_id) AS classRewards, 
         SUM(crc.points) as classPoints 
        from classroom_redeemed_codes crc 
         JOIN organisation_classrooms t 
          ON crc.classroom_id = t.classroom_id 
          AND t.organisation_id = 37383 
        where crc.inactive = 0 
         AND (crc.date_redeemed >= 1393286400 
         OR crc.date_redeemed = 0) 
        group by crc.classroom_id) r 
     ON t.classroom_id = r.classroom_id 

    LEFT OUTER JOIN organisation_classrooms_myusers ocm 
     ON t.classroom_id = ocm.classroom_id 
WHERE 
    t.organisation_id = 37383 
GROUP BY title 
ORDER BY t.classroom_id ASC 
LIMIT 10 
+0

Tôi nghĩ rằng nó tốt hơn không sử dụng CDbCriteria cho các truy vấn phức tạp như vậy. Bạn có thể thử sử dụng CDbCommandBuilder thay vì – Gihan

Trả lời

4

Nó không đẹp, nhưng bạn hỏi cho nó: D

$criteria = new CDbCriteria(); 
$criteria->select = ' 
    t.classroom_id, 
    title, 
    COALESCE (r.classRewards, 0) AS totalRewards, 
    COALESCE (r.classPoints, 0) AS totalPoints, 
    COALESCE (COUNT(DISTINCT ocm.user_id), 0) AS totalStudents'; 

$criteria->join = ' 
    LEFT JOIN (select crc.classroom_id, 
         COUNT(DISTINCT crc.redeemed_code_id) AS classRewards, 
         SUM(crc.points) as classPoints 
        from classroom_redeemed_codes crc 
         JOIN organisation_classrooms t 
          ON crc.classroom_id = t.classroom_id 
          AND t.organisation_id = 37383 
        where crc.inactive = 0 
         AND (crc.date_redeemed >= 1393286400 
         OR crc.date_redeemed = 0) 
        group by crc.classroom_id) r 
     ON t.classroom_id = r.classroom_id 

    LEFT OUTER JOIN organisation_classrooms_myusers ocm 
     ON t.classroom_id = ocm.classroom_id 
'; 

$criteria->group = 'title'; 
$criteria->order = 't.classroom_id ASC'; 
$criteria->limit = 10; 
$criteria->addCondition('t.organisation_id = :id'); 
$criteria->params[':id'] = 37383; 

thì:

// I will assume that model class name is OrganisationClassrooms 
$models = OrganisationClassrooms::model()->findAll($criteria); 

// or use it with a dataprovider 
$dataProvider= new CActiveDataProvider('OrganisationClassrooms' , array(
    'criteria' => $criteria, 
)) 
+0

Tôi thậm chí không có thời gian để kiểm tra điều này ... nhưng hey giáng sinh của nó và nó có vẻ tốt với tôi. Bounty là của bạn :) – Zabs

+0

Tôi chắc chắn nó hoạt động: D, bạn đã không được giao tiền thưởng? – tinybyte

2

Tôi khuyên bạn nên tạo thủ tục lưu trữ cho điều đó, để bạn có thể dễ dàng xử lý truy vấn này. ví dụ: -

$sql = Yii::app()->db->createCommand("CALL sp_getstudentdetails(:organisation_id, :date_redeemed)"); 
$row = $sql->queryAll(array(':organisation_id' => $organisation_id, ':date_redeemed' => date_redeemed)); 
Các vấn đề liên quan