2012-03-30 16 views
5

Mit einer Abfrage wie diese:Yii: Wie ORDER BY vor GROUP BY mit 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; 

Ich weiß, wie es findAllBySql mit tun:

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

Aber ich frage mich, ob es eine Möglichkeit ist, diese mit CDbCriteria Ursache des folgenden Code zu tun funktioniert natürlich nicht:

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

Danke.

+0

Hilft das? http://stackoverflow.com/questions/8467698/sub-queries-activerecord-yii –

+0

Interessant, so dass das Lesen dieses Links aussieht, ist nicht möglich, es mit CDbCriteria zu tun. Vielen Dank! – Puigcerber

Antwort

6

Wenn Sie eine anständig komplexe SQL-Abfrage haben, empfiehlt es sich, sie in SQL zu behalten, anstatt sie in Active Record zu schreiben. Ja, es begrenzt die Portabilität der Datenbank, aber Sie haben wahrscheinlich kein tun dieser Abfragen und einfacher und wartungsfreundlicher Code gewinnt immer.

+1

So wie es aussieht, ist es nicht möglich, es mit CDbCriteria zu tun und das ist die einzige Antwort, ich akzeptiere es. Vielen Dank. – Puigcerber

+0

FWs, vor allem Yii (ich arbeite mit ihm in der Firma) haben viele Unbehagen Unmöglichkeiten wie Modelle mit Fehlern, Sitzungen in Yii, zum Beispiel, können nicht Werte in assoziativen mehrdimensionalen Array speichern. Deshalb stelle ich auch einen Punkt auf. –

+2

Die Frage war nicht, was ist die beste Praxis für anständig komplexe SQL-Abfrage. –

10

Ich weiß, es ist zu spät. Ich hatte ähnliches Problem, und ich versuche, so zu nähern

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

Es löste mein Problem. Wenn Sie max_added_on abrufen möchten, müssen Sie lediglich eine weitere Eigenschaft für die Modellklasse hinzufügen.