it-roy-ru.com

Yii2 Как выполнить где И или 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)

Спасибо

31
Vikas Chaudhary

Вы можете попробовать это:

//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();
50
gouki

попробуй это - 

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

больше информации

30
mohit

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

3
cedricliang

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

$data = model::find()
->andWhere('plz = :plz',[':plz' => 40])
->andWhere('plz = :plz',[':plz' => 40000])
->all();
3
fsn

С MongoDB:

            $query->andWhere(['and',
                ['$eq', 'status', 1],
                ['$in', 'activity', [1, 2]],
            ]);
            $query->orWhere(['$in', 'yourField', $yourArray]);

Проверено. Похоже с СУБД.

2
ThangTD

Сначала используйтеИЛИусловие. Например:

(new \yii\db\Query())
            ->select(['id', 'client', 'ts', 'action'])
            ->from('log_client as log')
            ->orWhere(['action' => 'lock'])
            ->orWhere(['action' => 'rel'])
            ->andWhere(['in', 'client', $IDs])
            ->orderBy(['ts' => SORT_ASC])
            ->all();

Это будет похоже на "И... (..ИЛИ..)"

0
Andreykin Sergey

Функция where()ActiveQuery также принимает строку в качестве первого параметра, который будет использоваться в условии WHERE запроса. Поэтому проще всего было бы поместить эти условия в функцию where()function. 

Предполагая, что вы используете модель 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();

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

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

0
Tahir