我是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)
由于
答案 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;
答案 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
当然你应该在查询中使用预准备语句而不是硬编码值,但上面的代码只是为了给你一个想法。
中找到更多详细信息答案 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();