Yii2 Как выполнить группировку где И или ИЛИ условий?
Я новичок в фреймворке Yii-2. Как я могу выполнить следующий запрос в рамках Yii-2, используя ActiveQuery и модели.
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)
Спасибо
6 answers
Вы можете попробовать это:
//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();
Попробуйте это -
$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;
Я предполагаю, что вы уже знали о конфигурации базы данных в Yii 2.0, которая в основном такая же, как и в версии Yii 1.0.
Если вы хотите использовать ActiveQuery, сначала вам нужно определить класс "ПОЛЬЗОВАТЕЛИ":
<?php
namespace app\models;
use yii\db\ActiveRecord;
class USERS extends ActiveRecord {
public static function tableName()
{
return 'users';
}
}
?>
Затем, когда вы его используете, вы можете написать его следующим образом:
<?
$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();
?>
На мой взгляд, активный запрос предоставляет вам способ разделения sql по подблокам. Но нет никакого смысла применять его, когда у вас такое сложное "И ИЛИ", ГДЕ условие..
Вы также можете сделать это таким образом:
$data = model::find()
->andWhere('plz = :plz',[':plz' => 40])
->andWhere('plz = :plz',[':plz' => 40000])
->all();
С MongoDB
:
$query->andWhere(['and',
['$eq', 'status', 1],
['$in', 'activity', [1, 2]],
]);
$query->orWhere(['$in', 'yourField', $yourArray]);
Проверено. Аналогично с СУБД.
where()
функция ActiveQuery
также принимает строку в качестве своего первого параметра, который будет использоваться в условии WHERE
запроса. Поэтому проще всего было бы поместить эти условия в функцию where()
.
Предполагая, что вы используете модель ActiveRecord
, вы можете сделать что-то вроде следующего в своей модели.
$this->find()
->where("user_id IN(1,5,8) AND (status = 1 OR verified = 1) OR (social_account = 1 AND enable_social = 1)")
->all();
Конечно, вы должны использовать подготовленные инструкции вместо жесткого кодирования значений внутри запроса, но приведенный выше код просто дает вам представление.
Более подробную информацию вы можете найти в документации Здесь и Здесь