当前位置: 首页 > 后端技术 > PHP

Yii2查询where条件拼装

时间:2023-03-29 21:56:05 PHP

简介熟悉了Yii2查询条件后,用ActiveRecord查询数据就非常方便了。下面我们介绍where()方法中条件的组装方法。1语法Yii2使用where()方法(当然还有其他方法)实现条件过滤,语法:public$thiswhere($condition,$params=[])$params为可选参数,指定要取值绑定到查询。**$condition**为必填参数,$condition可以是字符串(如'id=1')或数组。$condition为数组时,有两种格式:hash格式:['column1'=>value1,'column2'=>value2,...]operator格式:[operator,operand1,operand2,...]2Hashformat通常,hash格式的查询条件会生成这样的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]//生成:statusISNULL3运算符格式在运算符格式中,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]//Generated:id!=10对于具体生成的SQL语句,operatorid会自动加上反斜杠引号`,操作数会自动转义。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.5betweenandnotbetween['between','id',1,10]//生成:idBETWEEN1AND10['notbetween','id',1,10]//生成:idNOTBETWEEN1AND10运算符后的操作数1是数据名称表列的operand2和operand3分别是该列取值范围的最小值和最大值。3.6inandnotin['in','id',[1,2,3]]//生成:idIN(1,2,3)['notin','id',[1,2,3]]//生成:idNOTIN(1,2,3)运算符后的operand1为列名或DB表达式,operand2为数组,指定列取值范围。此方法将引用该值并正确转义它。生成混合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]//Generate:nameLIKE'%tester'//这个是自定义查询方式,需要传入操作数3,值为false,在%后面加上操作数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%'ORname不喜欢'%sample%'3.8存在['存在',(newQuery())->select('id')->from('users')->where(['active'=>1])]//生成:EXISTS(SELECT"id"FROM"users"WHERE"active"=1)notexists用法和exists一样。