web-dev-qa-db-fra.com

Yii2 Comment jouer où ET ou OR groupement de conditions?

Je suis nouveau dans le framework Yii-2. Comment puis-je obtenir la requête suivante dans le cadre Yii-2 en utilisant activeQuery et ses modèles.

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)

Merci

31
Vikas Chaudhary

Vous pouvez essayer ceci:

//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

essaye ça - 

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

Plus d'informations

30
mohit

Je suppose que vous connaissez déjà la configuration de la base de données dans Yii 2.0, qui est fondamentalement la même que dans la version Yii 1.0. 

Si vous souhaitez utiliser activeQuery, vous devez d’abord définir une classe ‘USERS’:

<?php
    namespace app\models;
    use yii\db\ActiveRecord;

    class USERS extends ActiveRecord {
        public static function tableName()
        {
            return 'users';
        }
    }
?>

Ensuite, lorsque vous l'utilisez, vous pouvez l'écrire comme suit:

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

À mon avis, la requête active vous fournit un moyen de séparer SQL par sous-blocs. Mais cela n’a aucun sens de l’appliquer quand vous avez une telle condition compliquée 'AND OR' WHERE.

3
cedricliang

Vous pouvez aussi le faire de cette façon:

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

Avec MongoDB:

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

Testé. Similaire avec le SGBD.

2
ThangTD

UtilisezOUcondition au début. Par exemple:

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

Ce sera comme un "ET... (..OU..)"

0
Andreykin Sergey

La fonction where() de ActiveQuery accepte également la chaîne en tant que premier paramètre qui sera utilisé dans la condition WHERE de la requête. Le moyen le plus simple serait donc de placer ces conditions dans la fonction where()

En supposant que vous utilisez le modèle ActiveRecord, vous pouvez procéder comme suit dans votre modèle.

$this->find()
       ->where("user_id IN(1,5,8) AND (status = 1 OR verified = 1) OR (social_account = 1 AND enable_social = 1)")
       ->all();

Bien sûr, vous devriez utiliser des instructions préparées au lieu de coder en dur les valeurs dans la requête, mais le code ci-dessus est juste pour vous donner une idée.

Vous trouverez plus de détails dans la documentation Ici et Ici

0
Tahir