YII wehre拼接

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 一样。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值