菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
1396
0

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

原创
05/13 14:22
阅读数 3101

在用查询构造器或 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 不是同一个方法。

发表评论

0/200
1396 点赞
0 评论
收藏
为你推荐 换一批