web-dev-qa-db-ja.com

Yii2 ANDまたはOR条件グループ化の実行方法

Yii-2フレームワークは初めてです。 activeQueryとモデルを使用してYii-2フレームワークで次のクエリを達成するにはどうすればよいですか?.

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)

ありがとう

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

詳細

31
mohit

基本的にYii 1.0バージョンと同じYii 2.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をサブブロックで区切ることができます。ただし、このような複雑な「AND OR」WHERE条件がある場合に適用する意味はありません。

3
cedricliang

Uは次の方法でも実行できます。

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

テスト済み。 DBMSと同様。

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

AND ...(..OR ..)」のようになります

0

ActiveQuerywhere()関数は、クエリの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();

もちろん、クエリ内の値をハードコーディングする代わりに準備されたステートメントを使用する必要がありますが、上記のコードは単にアイデアを提供するためのものです。

詳細については、ドキュメントを参照してください Here および Here

0
Tahir