Yii2 Как выполнить группировку условий AND или OR?

Я новичок в структуре 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) 

благодаря

Вы можете попробовать следующее:

 //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, вам необходимо сначала определить класс «USERS»:

 <?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 на подблоки. Но не имеет смысла применять его, когда у вас есть такое сложное условие «И ИЛИ» ГДЕ.

U также может сделать это следующим образом:

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

Конечно, вы должны использовать подготовленные инструкции вместо значений жесткого кодирования внутри запроса, но выше код просто для того, чтобы дать вам представление.

Более подробную информацию вы можете найти здесь и здесь