- 字符串格式,例如:
'status=1'
- 哈希格式,例如:
['status' => 1, 'type' => 2]
- 操作符格式,例如:
['like', 'name', 'test']
- 对象格式,例如:
new LikeCondition('name', 'LIKE', 'test')
重点说
操作符格式
操作符格式允许你指定类程序风格的任意条件语句,如下所示:
[操作符, 操作数1, 操作数2, ...]
其中每个操作数可以是字符串格式、哈希格式或者嵌套的操作符格式, 而操作符可以是如下列表中的一个:
-
and
:操作数会被AND
关键字串联起来。例如,['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)
。 这个方法不会自动加引号或者转义。 -
or
:用法和and
操作符类似,这里就不再赘述。 -
not
:只需要操作数 1,它将包含在NOT()
中。例如,['not','id = 1']
将生成NOT (id=1)
。操作数 1 也可以是个描述多个表达式的数组。例如['not', ['status' => 'draft', 'name' => 'example']]
将生成NOT ((status='draft') AND (name='example'))
。 -
between
:第一个操作数为字段名称,第二个和第三个操作数代表的是这个字段 的取值范围。例如,['between', 'id', 1, 10]
将会生成id BETWEEN 1 AND 10
。 如果你需要建立一个值在两列之间的查询条件(比如11 BETWEEN min_id AND max_id
), 你应该使用 BetweenColumnsCondition。 请参阅 条件-对象格式 一章以了解有关条件的对象定义的更多信息。 -
not between
:与between
类似,除了BETWEEN
被NOT BETWEEN
替换 在生成条件时。 -
in
:第一个操作数应为字段名称或者 DB 表达式。第二个操作符既可以是一个数组, 也可以是一个Query
对象。它会转换成IN
条件语句。如果第二个操作数是一个 数组,那么它代表的是字段或 DB 表达式的取值范围。如果第二个操作数是Query
对象,那么这个子查询的结果集将会作为第一个操作符的字段或者 DB 表达式的取值范围。 例如,['in', 'id', [1, 2, 3]]
将生成id IN (1, 2, 3)
。 该方法将正确地为字段名加引号以及为取值范围转义。in
操作符还支持组合字段,此时, 操作数1应该是一个字段名数组,而操作数2应该是一个数组或者Query
对象, 代表这些字段的取值范围。 -
not in
:用法和in
操作符类似,这里就不再赘述。 -
like
:第一个操作数应为一个字段名称或 DB 表达式, 第二个操作数可以使字符串或数组, 代表第一个操作数需要模糊查询的值。比如,['like', 'name', 'tester']
会生成name LIKE '%tester%'
。 如果范围值是一个数组,那么将会生成用AND
串联起来的 多个like
语句。例如,['like', 'name', ['test', 'sample']]
将会生成name LIKE '%test%' AND name LIKE '%sample%'
。 你也可以提供第三个可选的操作数来指定应该如何转义数值当中的特殊字符。 该操作数是一个从需要被转义的特殊字符到转义副本的数组映射。 如果没有提供这个操作数,将会使用默认的转义映射。如果需要禁用转义的功能, 只需要将参数设置为false
或者传入一个空数组即可。需要注意的是, 当使用转义映射(又或者没有提供第三个操作数的时候),第二个操作数的值的前后 将会被加上百分号。
注意: 当使用 PostgreSQL 的时候你还可以使用 ilike, 该方法对大小写不敏感。
-
or like
:用法和like
操作符类似,区别在于当第二个操作数为数组时, 会使用OR
来串联多个LIKE
条件语句。 -
not like
:用法和like
操作符类似,区别在于会使用NOT LIKE
来生成条件语句。 -
or not like
:用法和not like
操作符类似,区别在于会使用OR
来串联多个NOT LIKE
条件语句。 -
exists
:需要一个操作数,该操作数必须是代表子查询 yii\db\Query 的一个实例, 它将会构建一个EXISTS (sub-query)
表达式。 -
not exists
:用法和exists
操作符类似,它将创建一个NOT EXISTS (sub-query)
表达式。 -
>
,<=
或者其他包含两个操作数的合法 DB 操作符:第一个操作数必须为字段的名称, 而第二个操作数则应为一个值。例如,['>', 'age', 10]
将会生成age>10
。
案例:
第一种最简单的就是上面提到的例子andWhere(['like', 'title','搜索的标题']);
生成的语句
... WHERE (`status` = 10) AND (`title` LIKE '%yii%')
第二种二种
addWhere(['and', 'id=1', 'name=2']);
生成的语句
... WHERE id=1 AND name=2
第三种三种
addWhere(['and', 'type=1', ['or', 'id=1', 'id=2']]);
生成的语句
... WHERE type=1 AND (id=1 OR id=2);
第四种四种
->andWhere(['or like','name',['哈哈','苦苦']]);
生成的语句WHERE `name` LIKE '%哈哈%' OR `name` LIKE '%苦苦%';第五种五种addWhere(['or',['like','name','哈哈'],['like','title','苦苦']]);//操作符格式的嵌套生成的语句
... WHERE (`status`=1) AND ((`name` LIKE '%哈哈%') OR (`title` LIKE '%苦苦%'))
$ids = [1,989,561];
User::updateAll(['is_delete'=>1],['and', ['store_id' => 11],['not in', 'third_id', $ids]]);