Yii2查询之where条件拼装
熟悉Yii2的查询条件后,用ActiveRecord查询数据非常方便。
以下我们介绍where()方法当中,条件的拼装方式。
1语法
Yii2用where()方法(当然还有其他方法)来实现条件筛选,语法:
public$thiswhere($condition,$params = [])
$params为可选参数,指定要绑定查询的值。
$condition为必选参数,$condition可以是字符串(如'id=1')或者数组。
$condition为数组时,有两种格式:
- 哈希格式:['column1'=>value1,'column2'=>value2,...]
- 运算符格式:[operator,operand1,operand2,...]
2哈希格式
通常,哈希格式的查询条件生成这样的SQL语句:
column1=value1ANDcolumn2=value2AND...
如果某个值是数组,就会生成IN语句。
如果某个值为null,会用ISNULL来生成语句。
例子:
['type'=>1,'status'=>2]//生成:(type=1)AND(status=2) ['id'=>[1,2,3],'status'=>2] //生成:(idIN(1,2,3))AND(status=2) ['status'=>null]//生成:statusISNULL
3运算符格式
在运算符格式,Yii会根据指定的运算符生成SQL语句。
运算符有:and、or、not、between、notbetween、in、notin、like、orlike、notlike、ornotlike、exists、notexists、>、<、=、>=、<=、!=等。
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.2and
['and','id'=>1,'id'=>2]//生成:id=1ANDid=2 ['and','id=1','id=2'] //生成:id=1ANDid=2 ['and','type=1',['or','id=1','id=2']]//生成:type=1AND(id=1ORid=2)
在第2条和第3条语句中,列名称和搜索值未用键值关系指定,所以生成的SQL不会添加引号,也不会转义。
3.3or
['or',['type'=>[7,8,9]],['id'=>[1,2,3]]] //生成:(typeIN(7,8,9)OR(idIN(1,2,3)))
3.4not
['not',['attribute'=>null]] //生成:NOT(attributeISNULL)
3.5between和notbetween
['between','id',1,10]//生成:idBETWEEN1AND10 ['notbetween','id',1,10]//生成:idNOTBETWEEN1AND10
运算符后面的运算数1为数据表列名称,运算数2和运算数3分别为列值范围的最小值和最大值。
3.6in和notin
['in','id',[1,2,3]] //生成:idIN(1,2,3) ['notin','id',[1,2,3]] //生成:idNOTIN(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',(newQuery())->select('id')->from('users')->where(['active'=>1])]
3.7like
['like','name','tester'] //生成:nameLIKE'%tester%' ['like','name',['test','sample']]//生成:nameLIKE'%test%'ANDnameLIKE'%sample%' ['like','name','%tester',false]//生成:nameLIKE'%tester' //这是自定义查询方式,要传入值为false的运算数3,并且自行添加%
运算数后面的运算数1为列名称或DB表达式,运算数2为字符串或数组,指定列值查询条件。
这个方法会为值添加引号,并正确转义。
orlike、notlike、ornotlike用法和like一样。
['orlike','name',['test','sample']]//生成:nameLIKE'%test%'ORnameLIKE'%sample%' ['notlike','name','tester']//生成:nameNOTLIKE'%tester%' ['ornotlike','name',['test','sample']]//生成:nameNOTLIKE'%test%'ORnameNOTLIKE'%sample%'
3.8exists
['exists',(newQuery())->select('id')->from('users')->where(['active'=>1])]//生成:EXISTS(SELECT"id"FROM"users"WHERE"active"=1)
notexists用法和exists一样。
参考地址:
- http://www.yiiframework.com/doc-2.0/yii-db-query.html#where()-detail