2014-12-16 22 views
5

CDbCriteria biçimine dönüştürüyorum Hala CD2Criteria Yii 1.xx işlevinin tüm işlevselliğini çalışıyorum - Bir model içinde sorguları CDbCriteria biçimi kullanarak dönüştürmek istediğiniz oldukça karmaşık bir SQL sorgusu var (Bu daha karmaşık bir sorgu ile mümkün olup olmadığını. şunaBu sorguyu Yii

Benim ilk girişimi ..

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

herkes aşağıdaki sorguyu kullanarak bu konuda gitmek için en iyi yol önerebilir? Herhangi bir tavsiye sayesinde önerilir ..

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

Ben böyle karmaşık sorgular için CDbCriteria kullanmamak daha iyi olur. CDbCommandBuilder yerine – Gihan

cevap

4

Pek hoş değil, ama bunun için sordu: D daha sonra

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

:

// 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

kullanmayı deneyebilirsiniz. Bunu test etmek için zamanım bile yok ... ama hey onun yılbaşı ve bana güzel görünüyor. Bounty seninsin :) – Zabs

+0

Eminim işe yarıyor: D, ödül vermedin mi? – tinybyte

2

Bunun için saklı yordam oluşturmanızı öneririm, bu nedenle bu sorguyu kolayca işleyebilirsiniz. örn. -

$sql = Yii::app()->db->createCommand("CALL sp_getstudentdetails(:organisation_id, :date_redeemed)"); 
$row = $sql->queryAll(array(':organisation_id' => $organisation_id, ':date_redeemed' => date_redeemed));