как использовать IN & Between в YII ACtive Record? - PullRequest
10 голосов
/ 20 мая 2011

Я хочу написать следующий запрос в активной записи.

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

Спасибо

Ответы [ 7 ]

31 голосов
/ 24 мая 2011

Вы можете использовать CDbCriteria оператор:

$criteria = new CDbCriteria();
$criteria->addInCondition('userId', array(6,7,8,9));
$result = User::model()->findAll($criteria);
10 голосов
/ 20 мая 2011

Вы можете поместить свой массив в качестве значения для определенного атрибута, например так (не проверено):

$model=new User();
$result=$model->findAllByAttributes(array('UserId'=>array(6,7,8,9)));
8 голосов
/ 08 июля 2014

Если вы хотите получить ваш запрос быстрее, используйте Command Builder:

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

Чтобы получить его через CActiveRecord, используйте findAllByAttributes

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

Но он получит полный объектпользователя со всеми связанными отношениями, поэтому он медленнее.

4 голосов
/ 01 сентября 2014

Вы можете использовать операторы IN и BETWEEN через CDbCriteria:

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

это приведет к тому, что запрос SQL будет выглядеть так:

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

Обратите внимание на 4-й параметр ИЛИ в addBetweenCondition () ; если его пропустить, то по умолчанию AND будет применено для объединения этого условия с остальной частью WHERE-запроса.

P.S. Строго говоря, эти методы addBetweenCondition() и addInCondition() должны быть добавлены к существующему условию. Итак, вам может понадобиться сначала установить начальное условие критерия, например:

$criteria->condition = '1=1';
0 голосов
/ 14 ноября 2017

Либо вы можете использовать addInCondition , либо вы также можете использовать сравни метод.

 $criteria = new CDbCriteria();
 $criteria->compare('UserId',array(6,7,8,9));
 $userDataObj = User::model()->findAll($criteria);
0 голосов
/ 29 июля 2014

В yii есть функция findAllBySql для запуска sql запроса и получения выходных данных.

$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'

«$ value» вернет результат в массиве. Для получения значений вы можете использовать следующий метод.

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

(или)

var index=0;
echo $val[$index]->UserId;
0 голосов
/ 08 июля 2014

Я все еще использую этот способ:

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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...