2014-12-16 7 views
5

Ich arbeite immer noch die gesamte Funktionalität von CDbCriteria in Yii 1.xx - Ich habe eine ziemlich komplexe SQL-Abfrage, die ich in das CDbCriteria-Format mit Abfragen innerhalb eines Modells (wenn dies möglich ist, mit einer komplexeren Abfrage.Konvertieren Sie diese Abfrage in CDbCriteria-Format in Yii

Mein erster Versuch dazu ..

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

Kann jemand empfehlen, den besten Weg, um dies zu realisieren Sie die folgende Abfrage verwenden? Jede Beratung wird durch empfohlen ..

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

Ich denke, es ist besser, nicht CDbCriteria für eine solche komplexe Abfragen zu verwenden. Sie können versuchen, CDbCommandBuilder anstelle – Gihan

Antwort

4

Es ist nicht schön, aber Sie haben es so gewollt: 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; 

dann:

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

zu verwenden, ich habe nicht einmal Zeit, das zu prüfen ... aber hey sein Weihnachten und es sieht gut zu mir aus. Die Bounty gehört dir :) – Zabs

+0

Ich bin mir sicher, es funktioniert: D, hast du keine Bounty zugewiesen? – tinybyte

2

Ich schlage vor, dass Sie für diese gespeicherte Prozedur erstellen, damit Sie diese Abfrage problemlos verarbeiten können. z. -

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