2012-03-30 10 views
5

Con una query come questa:Yii: come ordinare prima di GROUP BY con 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; 

so come farlo utilizzando 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)); 

ma mi chiedevo se c'è qualche modo per farlo utilizzando CDbCriteria causa il seguente codice , naturalmente, non funziona:

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

Grazie.

+0

Questo aiuto? http://stackoverflow.com/questions/8467698/sub-queries-activerecord-yii –

+0

Interessante, quindi la lettura del collegamento sembra impossibile con CDbCriteria. Grazie! – Puigcerber

risposta

6

Se si dispone di una query SQL decentemente complessa, è consigliabile mantenerla in SQL anziché scriverla in Active Record. Sì, limita la portabilità del database, ma probabilmente non disponi di queste informazioni e il codice più semplice e più gestibile vince sempre.

+1

Quindi come sembra non è possibile farlo usando CDbCriteria e questa è l'unica risposta, lo accetto. Grazie. – Puigcerber

+0

I FW, in particolare Yii (ci sto lavorando in azienda) hanno molte difficoltà impossibili come i Modelli con bug, le sessioni in Yii, ad esempio, non possono salvare i valori nell'array multidimensionale associativo. Questo è il motivo per cui ho impostato un punto su entrambi. –

+2

La domanda non riguardava la procedura migliore per query sql decentemente complesse. –

10

So che è troppo tardi. Ho avuto problemi simili, e cerco di affrontare in questo modo

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

E 'risolto il mio problema. Se si desidera recuperare max_added_on, è sufficiente aggiungere un'altra proprietà sulla classe del modello.