it-swarm.com.de

Yii2 Wie man wo und oder tut OR Bedingungsgruppierung?

Ich bin neu in Yii-2 Framework. Wie kann ich die folgende Abfrage in Yii-2-Framework mit activeQuery und Modellen erreichen?.

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)

Vielen Dank

31
Vikas Chaudhary

Sie können dies versuchen:

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

versuche dies - 

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

Mehr Info

30
mohit

Ich gehe davon aus, dass Sie bereits über die Datenbankkonfiguration in Yii 2.0 Bescheid wussten, was im Grunde die gleiche ist wie in der Version 1.0 von Yii 1.0. 

Wenn Sie activeQuery verwenden möchten, müssen Sie zuerst eine USERS-Klasse definieren:

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

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

Wenn Sie es verwenden, können Sie es wie folgt schreiben:

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

Meiner Meinung nach bietet die aktive Abfrage eine Möglichkeit, SQL nach Unterblöcken zu trennen. Es macht jedoch keinen Sinn, es anzuwenden, wenn Sie eine so komplizierte "UND ODER" -HERE-Bedingung haben.

3
cedricliang

Du kannst es auch so machen:

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

Mit MongoDB:

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

Geprüft. Ähnlich wie bei DBMS.

2
ThangTD

Verwenden Sie zuerst die BedingungODER. Zum Beispiel:

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

Es ist wie ein "UND... (..ODER..)"

0

Die Funktion where() von ActiveQuery akzeptiert auch string als ersten Parameter, der in der Bedingung WHERE der Abfrage verwendet wird. Am einfachsten wäre es also, diese Bedingungen in where()function zu setzen. 

Angenommen, Sie verwenden ein ActiveRecord-Modell, so können Sie in Ihrem Modell Folgendes ausführen.

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

Natürlich sollten Sie vorbereitete Anweisungen anstelle von hartcodierenden Werten in der Abfrage verwenden. Der obige Code dient jedoch nur zur Veranschaulichung.

Weitere Informationen finden Sie in der Dokumentation Hier und Hier

0
Tahir