2012-03-30 25 views
5

Con una consulta como esta:Yii: ¿cómo HACER PEDIDO antes de 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; 

sé cómo hacerlo usando 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)); 

Pero me preguntaba si hay alguna manera de hacer esto utilizando CDbCriteria causa el siguiente código , por supuesto, no funciona:

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

Gracias.

+0

¿Esto ayuda? http://stackoverflow.com/questions/8467698/sub-queries-activerecord-yii –

+0

Interesante, por lo que leer ese enlace parece que no es posible hacerlo con CDbCriteria. ¡Gracias! – Puigcerber

Respuesta

6

Si tiene una consulta SQL decentemente compleja, es mejor mantenerla en SQL en lugar de escribirla en Active Record. Sí, limita la portabilidad de la base de datos, pero probablemente no conozca estas consultas, y siempre gana un código más simple y más fácil de mantener.

+1

Así que como se ve no es posible hacerlo usando CDbCriteria y esta es la única respuesta, lo estoy aceptando. Gracias. – Puigcerber

+0

FWs, especialmente Yii (estoy trabajando con eso en compañía) tienen muchas imposibilidades de incomodidad como Modelos con errores, sesiones en Yii, por ejemplo, no pueden guardar valores en una matriz asociativa multidimensional. Es por eso que establezco un punto arriba tampoco. –

+2

La pregunta no era acerca de cuál es la mejor práctica para la consulta sql decentemente compleja. –

10

Sé que es demasiado tarde. Tuve un problema similar, y trato de acercarme así

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

Resolvió mi problema. Si desea recuperar max_added_on, solo tiene que agregar otra propiedad en la clase de modelo.