# [技巧] 叫你使用`5.1`的数组查询对象 用过`5.0`的开发者都比较依赖`5.0`的数组查询方式,但是很无奈`5.1`的数组查询方式和`5.0`的区别很大,因此经常听到开发者抱怨`5.1`的数组查询不好用。 >[info] 首先,出于安全和易用性的原因,官方是不推荐使用数组查询条件的,其次,你也许不知道`5.1`版本其实提供了一个新的**数组对象查询**的方式用以替代之前的数组条件。 >[danger] 如果你的版本是`V5.1.21+`的话,那么可以尝试下面提到的数组对象查询方式,一定会有意外的惊喜^_^ 对于习惯或者重度依赖数组查询条件的用户来说,可以选择数组对象查询,该对象完成了普通数组方式查询和系统的查询表达式之间的桥接,但**相较于系统推荐的查询表达式方方式而言,需要注意变量的安全性,避免产生SQL注入的情况**。 要使用数组对象查询,你首先需要引入`think\db\Where`类。 ``` use think\db\Where; ``` `Where`对象的用法一般有两种,第一种最简单,你依然和`5.0`一样使用数组条件进行定义查询条件,例如: ``` $map = [ 'name' => ['like', 'thinkphp%'], 'title' => ['like', '%think%'], 'id' => ['>', 10], 'status' => 1, ]; ``` 然后,在实际使用`where`方法的时候改为 ``` Db::name('user') ->where(new Where($map)) ->select(); ``` 生成的SQL是: ~~~sql SELECT * FROM `think_user` WHERE `name` LIKE 'thinkphp%' AND `title` LIKE '%think%' AND `id` > 10 AND `status` =1 ~~~ 这种方式最容易改造,相当于一键切换到`5.0`的数组查询方式。当然,除了`Db`查询之外,模型查询也一样可以支持。 第二种方式是,直接实例化一个`Where`对象,然后在`where`方法查询的时候直接传入该`Where`对象实例。 ~~~ $where = new Where; $where['id'] = ['in', [1, 2, 3]]; $where['title'] = ['like', '%php%']; Db::name('user') ->where($where) ->select(); ~~~ >[danger] `Where`对象实现了`ArrayAccess`接口,因此可以直接当成数组来赋值。 生成的SQL是: ~~~sql SELECT * FROM `think_user` WHERE `id` IN (1,2,3) AND `title` LIKE '%php%' ~~~ 使用`Where`对象查询可以和其它的查询方式混合使用。如果你在混合使用数组查询对象的时候,希望某个数组查询对象的查询条件加上括号,可以使用 ~~~ $where = new Where; $where['id'] = ['in', [1, 2, 3]]; $where['title'] = ['like', '%php%']; Db::name('user') ->where($where->enclose()) ->where('status', 1) ->select(); ~~~ 生成的SQL是: ~~~sql SELECT * FROM `think_user` WHERE ( `id` IN (1,2,3) AND `title` LIKE '%php%' ) AND `status` =1 ~~~ `enclose`方法表示该查询条件两边会加上括号包起来。 >[danger] 使用数组对象查询的情况请一定要注意做好数据类型检查,尽量避免让用户决定你的数据,从而导致SQL注入的可能。