php - query - yii2 expression where
Yii2 ¿Cómo se realiza donde AND u OR se agrupan? (6)
Soy nuevo en el framework Yii-2. ¿Cómo puedo lograr la siguiente consulta en el marco Yii-2 utilizando activeQuery y modelos?
SELECT * FROM users AS u WHERE u.user_id IN(1,5,8) AND (u.status = 1 OR u.verified = 1) OR (u.social_account = 1 AND u.enable_social = 1)
Gracias
Con MongoDB
:
$query->andWhere([''and'',
[''$eq'', ''status'', 1],
[''$in'', ''activity'', [1, 2]],
]);
$query->orWhere([''$in'', ''yourField'', $yourArray]);
Probado Similar con DBMS.
Puedes probar esto:
//SELECT * FROM users AS u WHERE u.user_id IN(1,5,8) AND (u.status = 1 OR u.verified = 1) OR (u.social_account = 1 AND u.enable_social = 1)
$model = arname()->find()
->andWhere([''user_id''=>[1,5,8]])
->andWhere([''or'',
[''status''=>1],
[''verified''=>1]
])
->orWhere([''and'',
[''social_account''=>1],
[''enable_social''=>1]
])
->all();
Supongo que ya conoces la configuración de la base de datos en Yii 2.0, que es básicamente la misma que en la versión Yii 1.0.
Si desea utilizar activeQuery, primero debe definir una clase de ''USUARIOS'':
<?php
namespace app/models;
use yii/db/ActiveRecord;
class USERS extends ActiveRecord {
public static function tableName()
{
return ''users'';
}
}
?>
Luego, cuando lo uses, puedes escribirlo de la siguiente manera:
<?
$usr_data = USERS::find()->
->where("user_id IN(1,5,8) AND (status = 1 OR verified = 1) OR (social_account = 1 AND enable_social = 1)")
->all();
?>
En mi opinión, la consulta activa le proporciona una manera de separar sql por sub-bloques. Pero no tiene ningún sentido aplicarla cuando tiene una condición ''Y O'' DONDE tan complicada ...
U también puede hacerlo de esta manera:
$data = model::find()
->andWhere(''plz = :plz'',['':plz'' => 40])
->andWhere(''plz = :plz'',['':plz'' => 40000])
->all();
prueba esto -
$query = (new /yii/db/Query())
->select(''*'')
->from(''users u'')
->where([''and'',[''u.user_id''=>[1,5,8]],[''or'',''u.status=1'',''u.verified=1'']])
->orWhere([''u.social_account''=>1,''u.enable_social''=>1]);
$command = $query->createCommand();
print_r ($command->sql);die;
where()
de ActiveQuery
también acepta la cadena como su primer parámetro que se usará en la condición WHERE
de la consulta. Así que la forma más fácil sería poner esas condiciones en where()
funcione.
Suponiendo que está utilizando el modelo ActiveRecord
, puede hacer algo como seguir en su modelo.
$this->find()
->where("user_id IN(1,5,8) AND (status = 1 OR verified = 1) OR (social_account = 1 AND enable_social = 1)")
->all();
Por supuesto, debe usar declaraciones preparadas en lugar de valores de codificación en la consulta, pero el código anterior es solo para darle una idea.
Puede encontrar más detalles en la documentación Here y Here