ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
| 版本 | 功能调整 | | --- | --- | | 5.0.5 | 原生查询不支持返回数据集对象 | 默认的结果类型是数组 ``` 'resultset_type' => 'array', ``` ### **获取单条数据** Db类find返回数组 ``` $users = \think\Db::name('user')->find(1); ``` ![](https://img.kancloud.cn/ea/0e/ea0ec86f16ea886835f6e9fda62ef56d_169x93.png) 返回Model模型对象(这里是User模型对象) 模型对象数据库查出的值在data属性里, 通过__get动态获取字段的值 ``` $users1 = model('user')->find(1); $users2 = model('user')::find(1); $users3 = model('user')::get(1); echo $users1->id; echo $users2->id; echo $users3->id; ``` ![](https://img.kancloud.cn/70/0d/700d8ae3853a64454e48d91c80b84de4_255x114.png) 模型对象可以直接使用toArray()转成数组 ``` $user1=$users1->toArray() ``` ![](https://img.kancloud.cn/1a/8f/1a8fee428b39306833b0e6fffa943cde_192x87.png) ### **获取多条数据** select和All默认返回模型组成的数组 ``` $users1 = \think\Db::name('user')->select(); $users2 = model('user')::all(); $users3 = \app\index\model\User::all(); ``` ![](https://img.kancloud.cn/8a/fc/8afc302fb3391c286bf5e5707592be20_284x312.png) 可知select和All在` 'resultset_type' => 'array',`的情况下是无法直接使用toArray的 我们可以将User模型遍历出来在进行toArray()进行转化,第二种办法就是直接将数据转为数据集类在进行toArray() ``` collection($users3)->toArray() ``` ![](https://img.kancloud.cn/1b/e8/1be81f534a5bcc28dfc77fb398779ab1_140x98.png) ### **让select和All默认返回数据集类** 数据库的查询结果也就是数据集,database.php默认的配置下,数据集的类型是一个二维数组,我们可以配置成数据集类,就可以支持对数据集更多的对象化操作,需要使用数据集类功能,可以有以下几种方法 **1、database.php配置数据库的`resultset_type`参数如下:** ~~~ return [ // 数据集返回类型 注意这里的值是全小写的collection,或者`'\think\Collection'` 'resultset_type' => 'collection', ]; ~~~ **2、或者在模型中定义resultSetType 属性** ~~~ protected $resultSetType = 'collection'; ~~~ **3、V5.1.23+ 版本开始,你可以在查询的时候指定是否需要返回数据集(无需配置 resultset\_type 参数)** ~~~ // 获取数据集 $users = Db::name('user')->fetchCollection()->select(); ~~~ 配置完成后返回的数据集对象是`think\Collection`, ``` $users1 = \think\Db::name('user')->select(); $users2 = model('user')::all(); $users3 = \app\index\model\User::all(); ``` ![](https://img.kancloud.cn/7e/38/7e38fd900adb7a71611dd904088ab011_195x190.png) `think\Collection`提供了和数组无差别用法,并且另外封装了一些额外的方法。、 可以直接使用数组的方式操作数据集对象,例如: ~~~ // 获取数据集 $users = \think\Db::name('user')->select(); // 直接操作第一个元素结果直接为数组了哦 $item = $users[0]; dump($item); // 获取数据集记录数 $count = count($users);//3 // 遍历数据集 foreach($users as $user){ //遍历后的$user也是数组了 echo $user['username'].'<--->'; echo $user['id'].'@<br>'; } //数据集直接转为数组 $users_arr=$users->toArray(); dump($users_arr); ~~~ ![](https://img.kancloud.cn/94/dc/94dc3c2c93d58ccd1d9b22e78396afa9_211x280.png) 需要注意的是,如果要判断数据集是否为空,不能直接使用`empty`判断,而必须使用数据集对象的`isEmpty`方法判断,例如: ~~~ $users = \think\Db::name('user')->select(); if($users->isEmpty()){ echo '数据集为空'; } ~~~ ## **总结:** >[info]find() 查询结果必为 一维数组 value/column 查询结果必为 int/string/一维数组 select与All 当配置resultset\_type => collection 时, 查询结果为 collection数据集 select 当配置resultset\_type => array时,如果用Db::类查询为二维数组,但如果用Model类查询为Model对象(使用不当会报错,因为它是个对象)可用collection($Model);转为数据集 结论: Query查询单条数据返回数组,Model查询单条数据返回的模型类可以直接使用toArray()转数组 Query和Model查询多条数据时 ## **数据集方法操作** **Model:** ``` // 获取数据集 $users = model('user')->select(); if ($users instanceof \think\Collection && !$users->isEmpty()) { //获取全部的数据 dump($users->all()); dump($users->toArray()); } ``` ![](https://img.kancloud.cn/aa/19/aa19c34ed659a1ee0ece0d435adc904c_172x205.png) 虽然返回的是Model但是还是可以向操作数组那样操作Model里的data属性 ``` // 获取数据集 $users = model('user')->select(); $users = model('user')::All(); if ($users instanceof \think\Collection && !$users->isEmpty()) { //获取全部的数据 dump($users); dump($users->all()); dump($users->column('id','username'));//column用法和array_column一致 dump($users[0]['username']); $users[0]['xixi']='haha'; dump($users->toArray()); } ``` ![](https://img.kancloud.cn/25/6c/256ce13e8ebdb1ed49e45182002ee0b0_553x476.png) ![](https://img.kancloud.cn/9c/43/9c4331b0db237218277ea6bca2d8c78d_204x83.png) **Query:** ``` // 获取数据集 $users = \think\Db::name('user')->select(); if ($users instanceof \think\Collection && !$users->isEmpty()) { //获取全部的数据 Query获取多条数据时,同$users->toArray() dump($users->all()); $newUsers=$users->merge(['name'=>'dash']); dump($newUsers); $newUsers=$users->merge([['name'=>'dash','id'=>4,'pwd'=>'123','sex'=>'1']]); dump($newUsers); dump($users->all()); dump($newUsers->all()); } ``` ![](https://img.kancloud.cn/1f/7f/1f7f8e660efd08e58c064fce0ae97771_612x612.png) ``` // 获取数据集 $users = \think\Db::name('user')->select(); if ($users instanceof \think\Collection && !$users->isEmpty()) { //获取全部的数据 dump($users->all()); $users->pop(); dump($users->all()); } ``` ![](https://img.kancloud.cn/bf/e6/bfe6bc7d1c06d70bbd852b9bdb12beb3_199x183.png) ``` // 获取数据集 $users = \think\Db::name('user')->select(); if ($users instanceof \think\Collection && !$users->isEmpty()) { //获取全部的数据 dump($users->all()); $users->unshift(['name'=>'张三','id'=>4,'pwd'=>'123','sex'=>'1']); $users->unshift(['name'=>'李四','id'=>5,'pwd'=>'456','sex'=>'1'],"自定义键"); dump($users->all()); } ``` ![](https://img.kancloud.cn/a9/c5/a9c56fed56796619d1eecb9a47175980_247x374.png) ``` // 获取数据集 $users = \think\Db::name('user')->select(); if ($users instanceof \think\Collection && !$users->isEmpty()) { //获取全部的数据 dump($users->all()); dump($users->column('id'));//column用法和array_column一致 dump($users->column('id','username')); } ``` ![](https://img.kancloud.cn/4f/cf/4fcf120b932ab61b11978aca41f47f09_278x343.png) `Collection`类包含了下列主要方法: | 方法 | 描述 | | --- | --- | | isEmpty() | 是否为空 | | toArray() | 转换为数组 | | toJson() | 转换为json | | all() | 所有数据 | | merge($items) | 合并其它数据 | | diff($items) | 比较数组,返回差集 | | flip() | 交换数据中的键和值 | | intersect($items) | 比较数组,返回交集 | | keys() | 返回数据中的所有键名 | | pop() | 删除数据中的最后一个元素 | | shift() | 删除数据中的第一个元素 | | unshift($value, $key = null) | 在数据开头插入一个元素 | | push($value, $key = null)| 在数组结尾插入一个元素 | | reduce(callable $callback, $initial = null) | 通过使用用户自定义函数,以字符串返回数组 | | reverse() | 数据倒序重排 | | chunk($size, $preserveKeys = false) | 数据分隔为多个数据块 | | each(callable $callback) | 给数据的每个元素执行回调 | | filter(callable $callback = null) | 用回调函数过滤数据中的元素 | | column($columnKey, $indexKey = null) | 返回数据中的指定列 | | sort(callable $callback = null) | 对数据排序 | | shuffle() | 将数据打乱 | | slice($offset, $length = null, $preserveKeys = false) | 截取数据中的一部分 |