2011-05-20 8 views
9

Quiero escribir una consulta siguiente en registro activo.cómo usar IN & Between Clause en YII ACtive Record?

SELECT * 
FROM `User` 
WHERE `UserId` 
IN (6, 7, 8, 9) ; 

Gracias

+1

Lo sentimos, no recibo su pregunta ......? – Pushpendra

+1

Está buscando la sintaxis de CActivRecord en Yii para generar una instrucción de SQL como en este ejemplo. –

+0

¡Considera aceptar la respuesta a tu pregunta! – Justinas

Respuesta

10

Usted puede poner su matriz como un valor para un atributo específico, como esto (no probado):

$model=new User(); 
$result=$model->findAllByAttributes(array('UserId'=>array(6,7,8,9))); 
+0

¿Por qué el nuevo usuario()? ¿Es eso superior a User :: model() de alguna manera? –

+0

Hola Bob, el usuario es el nombre del modelo bajo protegidas/modelos/user.php –

+1

Creo que Bob estaba preguntando ¿por qué hacerlo en dos líneas en lugar de un solo usuario :: 'modelo() -> findAllByAttributes (array ('UserId' => array (6,7,8,9))); '? –

31

Puede utilizar CDbCriteria declaración:

$criteria = new CDbCriteria(); 
$criteria->addInCondition('userId', array(6,7,8,9)); 
$result = User::model()->findAll($criteria); 
+0

¿Existe una solución igual que la de [tag: yii2]? – SaidbakR

0

Todavía uso de esta manera:

public function getInterval($data_start, $data_stop){ 
    $criteria = new CDbCriteria; 
    $criteria->condition = "date >= '$data_start' AND date <= '$data_stop'"; 
    return $criteria; 
} 
$model = Object::model()->findAll(getInterval('2014-06-01','2014-06-30'); 
+0

¿no está expuesto a la inyección SQL? – Justinas

+0

buena pregunta. Lo buscare. –

8

Si desea obtener su consulta rápida, utilice el comando Constructor:

Yii::app()->db->createCommand() 
    ->select('*') 
    ->from('user') 
    ->where(array('in', 'UserId', array(6, 7, 8, 9))) 
    ->queryAll(); 

Para conseguirlo a través de CActiveRecord, utilice findAllByAttributes

User::model() 
    ->findAllByAttributes(array(
     'UserId' => array(6,7,8,9) 
    )); 

pero conseguirá llena de objetos de usuario con todos relaciones asociadas, por lo que es más lento.

+1

'donde (array ('in', 'column_name', array())' me salvó, ¡salud! – Mave

0

Hay una función llamada findAllBySql en yii para ejecutar la consulta SQL y obtener los resultados.

$sql="SELECT * FROM `User` WHERE `UserId` IN (6, 7, 8, 9)";//Your Sql query 
$value=User::model()->findAllBySql($sql);// "User" is the model belongs to the table 'User' 

El "$ value" devolverá el resultado en una matriz. Para obtener los valores, puede usar el siguiente método.

foreach($value as $val){ 
    echo $val->UserId; 
} 

(o)

var index=0; 
echo $val[$index]->UserId; 
3

Es posible utilizar tanto dentro como entre las declaraciones a través CDbCriteria:

$criteria = new CDbCriteria(); 
$criteria->addInCondition("id", array(6,7,8,9)); 
$criteria->addBetweenCondition('id', '10', '20', 'OR'); 
$result = User::model()->findAll($criteria); 

Esto resultará en la consulta SQL como esto:

SELECT * 
FROM `User` 
WHERE `id` 
IN (6, 7, 8, 9) 
OR `id` BETWEEN 10 AND 20 

Tenga en cuenta el 4 ° parametro O en addBetweenCondition() metodo; faltándolo, se aplicará Y predeterminado para concatenar esa condición al resto de la consulta WHERE.

P.S. Estrictamente hablando, esos métodos addBetweenCondition() y addInCondition() se deben agregar a una condición existente. Por lo tanto, es posible que tenga que configurar primera condición inicial de un criterio de esta manera:

$criteria->condition = '1=1'; 
0

O se puede utilizar addInCondition o también puede utilizar comparar método.

$criteria = new CDbCriteria(); 
$criteria->compare('UserId',array(6,7,8,9)); 
$userDataObj = User::model()->findAll($criteria); 
Cuestiones relacionadas