💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] >[danger]取消`resultset_type`配置参数 数据集查询结果不再受`resultset_type`配置参数影响,默认情况下,Db查询统一返回数组,模型查询统一返回模型对象和模型数据集对象。如果Db查询的时候也需要返回数据集的话,可以显式调用`fetchCollection`方法。 模型查询单条数据的方法返回model,空数据使用`if($result)、if(empty($result))等是不会有效果的`我们需要将返回的空Model用toArray转换为空数组在进行上面的判断 tp5时数据返回的类型在配置文件设置:'resultset_type'=>'array' 返回类型改为数据集:'resultset_type'=>'collection' tp6没有统一规范返回数据的配置了(好像放在**database.php**配置文件还能用?) ## **最佳实践** >[info] 模型查询的最佳实践原则是: > 在模型外部使用静态方法进行查询, > 内部使用[动态方法](#index)查询,包括使用数据库的查询构造器 # **获取单个数据** >[danger]`Model::find($idValue)` 返回的是模型对象实例或者null,如果不想返回null而是空模型对象则使用`Model::findOrEmpty($idValue)` > 模型查询除了使用自身的查询方法(save、saveAll、delete、create、update、destroy)外,一样可以使用数据库的查询构造器 > 如果你是在模型内部获取数据,请不要使用`$this->name`的方式来获取数据,请使用`$this->getAttr('name')`替代。 ## **find($idValue)** 返回模型对象或者null ~~~ // 取出主键为1的数据,相当于select * from think_user where id=1; $user = User::find(1); echo $user->name; // 取出主键为1,3的数据,相当于select * from think_user where id in(1,3) limit 1; $user = User::find([1,3]);//既然是单条这里允许数组参数有什么用呢? echo $user->name; // 使用查询构造器查询满足条件的数据 $user = User::where('name', 'thinkphp')->find(); echo $user->name; ~~~ ## **findOrEmpty($idValue)** 返回模型对象,无数据页返回空模型对象 转成数组需要toArray方法 ~~~ $user = User::where('name', 'thinkphp')->findOrEmpty(); //这种情况下,你可以用`isEmpty`方法来判断当前是否为一个空模型。 if (!$user->isEmpty()) { echo $user->name; } ~~~ # **获取多个数据select** ~~~ // 根据主键获取多个数据 $list = User::select([1,2,3]); 查询构造器:属于BaseQuery类的数据库查询方法 // 使用查询构造器查询 $list = User::where('status', 1)->limit(3)->order('id', 'asc')->select(); foreach($list as $key=>$user){ echo $user->name; } ~~~ # **获取某个字段或者某个列的值column** ~~~ // 获取某个用户的积分 User::where('id',10)->value('score'); // 获取某个列的所有值 User::where('status',1)->column('name'); // 以id为索引 User::where('status',1)->column('name','id'); ~~~ >[danger] `value`和`column`方法返回的不再是一个模型对象实例,而是纯粹的值或者某个列的数组。 # **<span id="index">动态查询(getBy字段名)</span>** 支持数据库的动态查询方法,例如: ~~~ // 根据name字段查询用户 $user = User::getByName('thinkphp'); // 根据email字段查询用户 $user = User::getByEmail('thinkphp@qq.com'); ~~~ # **聚合查询count** 同样在模型中也可以调用数据库的聚合方法查询,例如: ~~~ User::count(); User::where('status','>',0)->count(); User::where('status',1)->avg('score'); User::max('score'); ~~~ 注意,如果你的字段不是数字类型,是使用`max`/`min`的时候,需要加上第二个参数。 ~~~ User::max('name', false); ~~~ # **数据分批处理** 模型也可以支持对返回的数据分批处理,这在处理大量数据的时候非常有用,例如: ~~~ User::chunk(100, function ($users) { foreach($users as $user){ // 处理user模型对象 } }); ~~~ # **自定义数据集对象** 模型的`select`方法返回的是一个包含多个模型实例的数据集对象(默认为`\think\model\Collection`),支持在模型中单独设置查询数据集的返回对象的名称,例如: ~~~ <?php namespace app\index\model; use think\Model; class User extends Model { // 设置返回数据集的对象名 protected $resultSetType = '\app\common\Collection'; } ~~~ `resultSetType`属性用于设置自定义的数据集使用的类名,该类应当继承系统的`think\model\Collection`类。 >[danger]具体参阅数据集章节 # **使用游标查询** 模型也可以使用数据库的`cursor`方法进行游标查询,返回生成器对象 ~~~ foreach(User::where('status', 1)->cursor() as $user){ echo $user->name; } ~~~ `user`变量是一个模型对象实例。 # **数组转数据集collection** collection(array)将数组转为数据集后可以使用很多方法如hidden等这样方便临时隐藏字段等操作 # **隐藏不需要的字段 与 显示指定的字段** 返回的数据如果是对象的化还可以使用hidden和visible方法 或者 定义hidden和visible属性(推荐) 因为hidden和visible方法不能作用与关联模型的数据,而定义在相关模型中的hidden和visible属性则可以 不过hidden和visible方法可以用于临时隐藏,将返回的对象转为数据集,然后调用hidden方法就可以了