Yii2 Wie führt man eine AND- oder OR-Bedingungsgruppierung durch?

Lesezeit: 2 Minuten

Ich bin neu im Yii-2-Framework. Wie kann ich die folgende Abfrage im 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

Benutzer-Avatar
Gouki

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

  • Wie benutzt man es mit findOne()?

    – Moeez

    21. März 2018 um 5:23 Uhr


  • @Faisal ->one() Anstatt von ->all().

    – Boolescher_Typ

    13. Juni 2019 um 16:25 Uhr

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

Ich gehe davon aus, dass Sie bereits über die Datenbankkonfiguration in Yii 2.0 Bescheid wussten, die im Grunde dieselbe ist wie in der Version 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 dann 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 Ihnen die aktive Abfrage eine Möglichkeit, SQL nach Unterblöcken zu trennen. Aber es macht keinen Sinn, es anzuwenden, wenn Sie eine so komplizierte ‘AND OR’ WHERE-Bedingung haben.

Du kannst es auch so machen:

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

User::find()
    ->select('u_id , u_unique_id, u_first_name, u_last_name, u_username, u_email, u_image,u_phone') 
    ->andWhere("u_status != 2  AND u_id != 1 and u_role in (6,7)")
    ->andWhere(
        ['or',
            ['like', 'u_first_name', $searchVal],
            ['like', 'u_last_name', $searchVal],
            ['like', 'u_username', $searchVal],
            ['like', 'u_email', $searchVal]

        ]
        )
    ->all();

Benutzer-Avatar
halber

Mit MongoDB:

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

Geprüft. Ähnlich bei DBMS.

Benutzer-Avatar
Andrejkin Sergej

Verwenden ODER Zustand zunächst. 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 wird wie ein “UND… (..ODER..)”

1321210cookie-checkYii2 Wie führt man eine AND- oder OR-Bedingungsgruppierung durch?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy