Frage

Ich habe Abfrage wie folgt:

SELECT * FROM activity
WHERE (((userId = 1 OR userId IN(SELECT userId FROM follower WHERE followerId = 1))
AND activityType IN(1, 2, 3))
OR (targetId = 24 AND aType IN(1, 2, 3, 4, 5)))
ORDER BY id DESC;

Ich habe versucht model()->findAllBySql($sql) zu verwenden und es funktioniert. Aber ich will es CDbCriteria machen mit, wenn Sie eine andere Lösungen haben lassen Sie mich weiß es: D

War es hilfreich?

Lösung

Sie können nach wie vor diese Aussage bauen mit einem CDbCriteria Ich denke, ... so etwas wie:

$criteria=new CDbCriteria;
$criteria->condition = '
  (
    (
      userId = 1 OR 
      userId IN (SELECT userId FROM follower WHERE followerId = 1)
    )
    AND activityType IN(1, 2, 3)
  )
  OR (
    targetId = 24 
    AND aType IN(1, 2, 3, 4, 5)
  )
';
$criteria->order = 'id DESC';
$results=Activity::model()->findAll($criteria);

Als dieser Stelle könnte man genauso gut schreiben Sie einfach eine reguläre SQL-Anweisung, aber es könnte einige Vorteile, um es auf diese Weise tun. Bindung params, Zusammenführung Kriterien, Hinzufügen von zusätzlichen Kriterien, etc

Andere Tipps

Solange Ihre Ebene SQL Werke, du bist sicher. Es gibt viele Male, wenn ich Active Record wegzuwerfen haben und nur den Job in der ol‘vernünftigere Weise getan.

Ich habe versucht, diese Abfrage in eine lesbare CDbCriteria Konstruktion zu übersetzen. Schlechte Idee. Yü saugt, wenn es um Abfrage komplexer Daten kommt.

Die Antwort finden Sie hier: http://www.yiiframework.com/doc /guide/1.1/en/database.dao#executing-sql-statements

In Ihrem Fall:

$sql = 'SELECT * FROM activity';
$sql .= 'WHERE (((userId = 1 OR userId IN(SELECT userId FROM follower WHERE followerId = 1))';
$sql .= 'AND activityType IN(1, 2, 3))';
$sql .= 'OR (targetId = 24 AND aType IN(1, 2, 3, 4, 5)))';
$sql .= 'ORDER BY id DESC';

$connection = Yii::app()->db;
$command = $connection->createCommand($sql);
$results = $command->queryAll();

@pestaa ist richtig, dass manchmal muss man aktive Datensatz aus dem Fenster werfen. Dies gilt insbesondere, wenn Sie Massenupdates tun, wo zahlreiche Modelle Schleifen schrecklich ineffizient ist.

Just Verwendung CSqlDataProvider http://www.yiiframework.com/doc/api/1.1/CSqlDataProvider

Disclaimer: Ich weiß, es ist nicht präzise Antwort auf diese Frage particural aber es könnte funktionieren, um das Problem zu helfen, die gegeben wurde. Ich vermute, dass der Hauptzweck dieser Frage Art und Weise wird immer CGridView, CListView usw. mit beliebiger SQL zu verwenden.

Ich verwende CDbCriteria für komplexe Abfragen, in denen ich die with-Funktion verwenden.

Sie können wie diese komplexen Kriterien aufbauen:

$dbCriteria->with=array(
   '<relation1>'=>array( 'condition'=>'<condition for given relation>',
        'with'=>array('<relation2:relation of relation1>'
            =>array(<conditions for relation2>)
        )
        'scopes'=><scopes for relation1>
    )
);

Ich habe nicht geprüft, wie OR hier ins Spiel bekommen.

Durch die Bereiche verwenden, können Sie auch einfügen einige komplexere Kriterien und immer noch Ihre Suchbedingung lesbar halten.

Das ist ziemlich mächtig. Ich habe nicht ein komplettes ‚Tutorial‘ darüber sehen doch, Ich davon aus dem Quellcode Art abgeschlossen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top