2014-12-16 8 views
5

Sto ancora elaborando l'intera funzionalità di CDbCriteria in Yii 1.xx - Ho una query SQL abbastanza complessa che voglio convertire utilizzando il formato CDbCriteria con query all'interno di un modello (se questo è possibile con una query più complessa.Converti questa query in formato CDbCriteria in Yii

il mio primo tentativo di questo ..

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

qualcuno può suggerire il modo migliore per andare su questo utilizzando la seguente query? Qualche consiglio è consigliato grazie ..

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

Penso che sia meglio non usare CDbCriteria per tali query complesse. Puoi provare a usare CDbCommandBuilder invece – Gihan

risposta

4

Non è abbastanza, ma ha chiesto per esso: 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; 

poi:

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

Non ho nemmeno il tempo di provarlo ... ma hey è Natale e mi sembra bello. Il Bounty è tuo :) – Zabs

+0

Sono sicuro che funzioni: D, non hai assegnato taglie? – tinybyte

2

Suggerisco di creare una stored procedure per questo, in modo da poter gestire facilmente questa query. es. -

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