Domanda

Ho query come questa:

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;

Ho provare ad usare model()->findAllBySql($sql) e funziona. Ma voglio farlo utilizzando CDbCriteria, se si dispone di un altro soluzioni farmi sapere che: D

È stato utile?

Soluzione

Si potrebbe ancora costruire questa affermazione con un CDbCriteria credo ... qualcosa di simile:

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

Mentre questo punto si potrebbe anche solo scrivere un'istruzione SQL regolare, ma ci potrebbe essere qualche vantaggi a farlo in questo modo:. Params vincolante, la fusione criteri, l'aggiunta di criteri aggiuntivi, ecc

Altri suggerimenti

fino a quando il lavori SQL pianura, sei al sicuro. Ci sono molti momenti in cui devo buttare attivo record di distanza e solo ottenere il lavoro fatto in ol' modo più sano.

Ho cercato di tradurre questo query in una costruzione leggibile CDbCriteria. Cattiva idea. Yu succhia quando si tratta di query di dati complessi.

La risposta può essere trovato qui: http://www.yiiframework.com/doc /guide/1.1/en/database.dao#executing-sql-statements

Nel tuo caso:

$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 è giusto che a volte si devono gettare record attivo fuori dalla finestra. Ciò è particolarmente vero se si sta facendo gli aggiornamenti di massa in cui il ciclo attraverso numerosi modelli è terribilmente inefficiente.

Proprio uso CSqlDataProvider http://www.yiiframework.com/doc/api/1.1/CSqlDataProvider

Disclaimer: so che non è risposta precisa a questa domanda particural ma potrebbe aiutare aggirare il problema che è stato dato. Ho il sospetto che lo scopo principale di questa domanda è sempre modo di usare CGridView, CListView ecc con SQL arbitrario.

Io uso CDbCriteria per le query complesse in cui utilizzare la funzione with.

È possibile costruire criteri complessi in questo modo:

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

Non ho controllato come OR può entrare in gioco qui.

Utilizzando gli ambiti, è anche possibile inserire alcuni criteri più complessi e ancora mantenere la ricerca leggibile.

Questo è abbastanza potente. Non ho visto un 'esercitazione' complete su questo ancora; I tipi di concluso questo dal codice sorgente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top