1 语法
Yii2用
where()
方法(当然还有其他方法)来实现条件筛选,语法:
public
$this
where (
$condition
,
$params
= [] )
$params
为可选参数,指定要绑定查询的值。
$condition
为必选参数,
$condition
可以是字符串(如
'id=1'
)或者数组。
$condition
为数组时,有两种格式:
- 字符串格式,例如:'status=1'
- 哈希格式,例如: ['status' => 1, 'type' => 2]
- 操作符格式,例如:['like', 'name', 'test']
2 哈希格式
通常,哈希格式的查询条件生成这样的SQL语句:
column1
=value1 AND column2=value2 AND ...
如果某个值是数组,就会生成
IN
语句。
如果某个值为
null
,会用
IS
NULL
来生成语句。
例子:
[
'type'
=> 1,
'status'
=> 2]
// 生成:(type = 1) AND (status = 2)
[
'id'
=> [1, 2, 3],
'status'
=> 2]
// 生成:(id IN (1, 2, 3)) AND (status = 2)
[
'status'
=>
null
]
// 生成:status IS NULL
3 运算符格式
在运算符格式,Yii会根据指定的运算符生成SQL语句。
运算符有:
and
、
or
、
not
、
between
、
not
between
、
in
、
not
in
、
like
、
or
like
、
not
like
、
or
not
like
、
exists
、
not
exists
、
>
、
<
、
=
、
>=
、
<=
、
!=
等。
3.1 对比
[
'>'
,
'id'
, 1]
// 生成:id > 1
[
'<'
,
'id'
, 100]
// 生成:id < 100
[
'='
,
'id'
, 10]
// 生成:id = 10
[
'>='
,
'id'
, 1]
// 生成:id >= 1
[
'<='
,
'id'
, 100]
// 生成:id <= 100
[
'!='
,
'id'
, 10]
// 生成:id != 10
具体生成的SQL语句,运算符
id
会自动加上反斜杠引号
`
,运算数会自动转义。
3.2 and
[
'and'
,
'id'
=> 1,
'id'
=> 2]
// 生成:id=1 AND id=2
[
'and'
,
'id=1'
,
'id=2'
]
// 生成:id=1 AND id=2
[
'and'
,
'type=1'
, [
'or'
,
'id=1'
,
'id=2'
]]
// 生成:type=1 AND (id=1 OR id=2)
在第2条和第3条语句中,列名称和搜索值未用键值关系指定,所以生成的SQL不会添加引号,也不会转义。
3.3 or
[
'or'
, [
'type'
=> [7, 8, 9]], [
'id'
=> [1, 2, 3]]]
// 生成:(type IN (7, 8, 9) OR (id IN (1, 2, 3)))
3.4 not
[
'not'
, [
'attribute'
=>
null
]]
// 生成:NOT (attribute IS NULL)
3.5 between和not between
[
'between'
,
'id'
, 1, 10]
// 生成:id BETWEEN 1 AND 10
[
'not between'
,
'id'
, 1, 10]
// 生成:id NOT BETWEEN 1 AND 10
运算符后面的运算数1为数据表
列名称
,运算数2和运算数3分别为列值范围的
最小值
和
最大值
。
3.6 in和not in
[
'in'
,
'id'
, [1, 2, 3]]
// 生成:id IN (1, 2, 3)
[
'not in'
,
'id'
, [1, 2, 3]]
// 生成:id NOT IN (1, 2, 3)
运算符后面的
运算数1
为列名称或DB表达式,
运算数2
为数组,指定列值所在的范围。
这个方法会为值添加引号,并正确转义。
要生成混合
IN
条件,列名和列值都设置为数组,并且用列名为列值指定下标:
[
'in'
, [
'id'
,
'name'
], [[
'id'
=> 1,
'name'
=>
'foo'
], [
'id'
=> 2,
'name'
=>
'bar'
]]]
// 生成:(`id`, `name`) IN ((1, 'foo'), (2, 'bar'))
另外,还可以用子查询作为
IN
条件的值,如下:
[
'in'
,
'user_id'
, (
new
Query())->select(
'id'
)->
from
(
'users'
)->where([
'active'
=> 1])]
3.7 like
[
'like'
,
'name'
,
'tester'
]
// 生成:name LIKE '%tester%'
[
'like'
,
'name'
, [
'test'
,
'sample'
]]
// 生成:name LIKE '%test%' AND name LIKE '%sample%'
[
'like'
,
'name'
,
'%tester'
,
false
]
// 生成:name LIKE '%tester'
// 这是自定义查询方式,要传入值为false的运算数3,并且自行添加%
运算数
后面的运算数1为列名称或DB表达式,运算数2为字符串或数组,指定列值查询条件。
这个方法会为值添加引号,并正确转义。
or
like
、
not
like
、
or
not
like
用法和
like
一样。
[
'or like'
,
'name'
, [
'test'
,
'sample'
]]
// 生成:name LIKE '%test%' OR name LIKE '%sample%'
[
'not like'
,
'name'
,
'tester'
]
// 生成:name NOT LIKE '%tester%'
[
'or not like'
,
'name'
, [
'test'
,
'sample'
]]
// 生成:name NOT LIKE '%test%' OR name NOT LIKE '%sample%'
3.8 exists
[
'exists'
, (
new
Query())->select(
'id'
)->
from
(
'users'
)->where([
'active'
=> 1])] // 生成:EXISTS (SELECT
"id"
FROM
"users"
WHERE
"active"
=1)
not
exists
用法和
exists
一样。