用过5.0的开发者比较依赖5.0的数组查询方式,可惜5.1的数组查询方式和5.0有很大的不同,所以经常听到开发者抱怨5.1中的数组查询不好用。首先,出于安全和易用性的考虑,不推荐使用官方的数组查询条件。其次,大家可能不知道,5.1版本其实提供了一种新的数组对象查询方式来替代之前的数组条件。如果你的版本是V5.1.21+,可以试试下面提到的数组对象查询方式,会有意想不到的惊喜^_^对于习惯或者严重依赖数组查询条件的用户,可以选择数组对象查询,该对象完成了普通数组查询和系统查询表达式之间的桥梁,但与系统推荐的查询表达式方式相比,需要注意变量的安全性,避免SQL注入。使用数组对象查询,首先需要引入thinkdbWhere类。使用think\db\Where;Where对象一般有两种使用方式,第一种最简单,还是和5.0一样使用数组条件定义查询条件,例如:$map=['name'=>['like','thinkphp%'],'title'=>['like','%think%'],'id'=>['>',10],'status'=>1,];然后,在实际使用where方法时,改为Db::name('user')->where(newWhere($map))->select();生成的SQL是:SELECT*FROM`think_user`WHERE`name`LIKE'thinkphp%'AND`title`LIKE'%think%'AND`id`>10AND`status`=1这个方法最容易修改,相当于一键切换到5.0的数组查询方式。当然除了Db查询,还可以支持模型查询。第二种方式是直接实例化一个Where对象,然后在where方法查询的时候直接传入Where对象实例。$哪里=新哪里;$where['id']=['in',[1,2,3]];$where['title']=['like','%php%'];Db::name('user')->where($where)->select();Where对象实现了ArrayAccess接口,所以可以直接作为数组赋值。生成的SQL是:SELECT*FROM`think_user`WHERE`id`IN(1,2,3)AND`title`LIKE'%php%'使用Where对象的查询可以与其他查询方法混合使用。混合使用数组查询对象时,如果想在数组查询对象的查询条件中加上括号,可以使用$where=newWhere;$where['id']=['in',[1,2,3]];$where['title']=['like','%php%'];Db::name('user')->where($where->enclose())->where('status',1)->select();生成的SQL为:SELECT*FROM`think_user`WHERE(`id`IN(1,2,3)AND`title`LIKE'%php%')AND`status`=1enclose方法表示查询条件将两边用括号括起来。使用数组对象查询时,请注意数据类型检查,尽量避免让用户判断你的数据,这可能导致SQL注入的可能。
