Yii2如何执行AND或OR条件分组?

时间:2015-07-22 08:03:49

标签: php mysql activerecord yii yii2

我是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)

由于

8 个答案:

答案 0 :(得分:58)

你可以试试这个:

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

答案 1 :(得分:30)

试试这个 -

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

more info

答案 2 :(得分:3)

我假设您已经了解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的方法。但是当你有这么复杂的“AND OR”WHERE条件时,应用它是没有任何意义的。

答案 3 :(得分:3)

你也可以这样做:

template<class T>
T DecayType(T);

template<class T>
struct decay {
    using type = decltype(DecayType(declval<T>()));
};

答案 4 :(得分:2)

使用MongoDB

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

测试。与DBMS类似。

答案 5 :(得分:0)

where()的{​​{1}}函数也接受字符串作为其第一个参数,该参数将在查询的ActiveQuery条件中使用。最简单的方法是将这些条件放在WHERE函数中。

假设您使用的是where()模型,您可以在模型中执行以下操作。

ActiveRecord

当然你应该在查询中使用预准备语句而不是硬编码值,但上面的代码只是为了给你一个想法。

您可以在文档HereHere

中找到更多详细信息

答案 6 :(得分:0)

首先使用 OR 条件。例如:

(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 ..)”

答案 7 :(得分:0)

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