小解惑:查询构造器与集合中的 get 方法

在用查询构造器或 Eloquent 进行数据的获取时,通常会遇到这种情况:

// 取全部
DB::table('users')->get();     // 查询构造器中没有 all 方法
User::get();
User::all();
// 取特定数量
DB::table('users')->take(3)->get();
DB::table('users')->get()->take(3);
User::all()->take(3);
User::take(3)->get();

先说下结果,上面的程序两种方式取出的结果相同,只是数据类型不同(执行效率那就另说了):
查询构造器取出的是 Laravel 的「集合基类」,即 Illuminate\Support\Collection
Eloquent 取出的是 「Eloquent 集合」,即 Illuminate\Database\Eloquent\Collection,而 Eloquent 集合又是继承于集合基类。

那么问题来了,怎么有时候有 get(),有时候没有?
那就要先去 API 文档里找一下这个 get 方法,Laravel 中 get 方法很多,我们要找的查询构造器、 Eloquent 和 Collection 的。
查询构造器中(Illuminate\Database\Query\Builder):
file
如上所说,“像用 select 语句查询一样”。跟在查询构造器后,返回一个集合。

而集合(Illuminate\Support\Collection) 中的 get 则是另外一回事了,是从已有集合中取出需要的字段。
file

所以上面示例代码中的 get() 全部是查询构造器中的,返回集合。按文档中的介绍,Eloquent 也可以看作是查询构造器,具体是怎么实现的,我修行尚浅,现在还不懂。

take() 呢?在查询构造器中,take 是设置 limit 查询的别名,来看 limit()
file
注意,返回的是 $this,还是查询构造器。
再看集合中的 take,是从结果集中返回给定数量项的新集合。


现在知道什么时候加 get 了,总结一下

  1. 要从查询构造器实例中获取结果时,加;
  2. 如果已经是个集合了,那再 ->get() 是要出错的,除非加上参数,->get('key'),则表示从结果集中返回指定键的条目;
  3. 如果要限制数量,查询构造器和集合后面都可以跟 ->take(N),但注意,两个 take 不是同一个方法。
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!