Pregunta

Tengo consulta como la siguiente:

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;

He tratar de utilizar model()->findAllBySql($sql) y funciona. Pero quiero hacerlo usando CDbCriteria, si tiene otra solución que me haga saber que: D

¿Fue útil?

Solución

Usted todavía podría construir esta declaración con una CDbCriteria creo ... algo como:

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

A medida que este punto puede ser que también acaba de escribir una instrucción SQL regular, pero puede haber algunos beneficios para hacerlo de esta manera:. Params unión, la fusión de criterios, añadiendo criterios adicionales, etc.

Otros consejos

Mientras que su obra SQL lisos, estás a salvo. Hay muchos momentos en los que hay que tirar Active Record de distancia y acaba de obtener el trabajo hecho en el viejo camino más sano.

He intentado traducir esta consulta en una construcción CDbCriteria legible. Mala idea. Yu chupa cuando se trata de consulta de datos complejos.

La respuesta se puede encontrar aquí: http://www.yiiframework.com/doc /guide/1.1/en/database.dao#executing-sql-statements

En su 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 que es correcto que a veces hay que tirar registro activo por la ventana. Esto es especialmente cierto si usted está haciendo cambios masivos en bucle a través de numerosos modelos es terriblemente ineficiente.

Sólo uso CSqlDataProvider http://www.yiiframework.com/doc/api/1.1/CSqlDataProvider

Renuncia: Sé que no es una respuesta precisa a esta pregunta particural pero podría ayudar a evitar el problema que se le dio. Sospecho que el principal propósito de esta pregunta es cada vez manera de utilizar CGridView, etc. CListView con SQL arbitrario.

utilizo CDbCriteria para consultas complejas en la que utiliza la característica de with.

Se puede construir criterios complejos como esto:

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

No he comprobado cómo OR puede entrar en juego aquí.

Mediante el uso de ámbitos, también puede insertar algunos criterios más complejos y todavía mantener su condición de búsqueda legible.

Esto es bastante potente. No he visto un 'tutorial' completo sobre esto todavía; Me tipo de conclusión de esto desde el código fuente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top