小解惑:查询构造器与集合中的 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
):
如上所说,“像用 select 语句查询一样”。跟在查询构造器后,返回一个集合。
而集合(Illuminate\Support\Collection
) 中的 get 则是另外一回事了,是从已有集合中取出需要的字段。
所以上面示例代码中的 get() 全部是查询构造器中的,返回集合。按文档中的介绍,Eloquent 也可以看作是查询构造器,具体是怎么实现的,我修行尚浅,现在还不懂。
那 take()
呢?在查询构造器中,take 是设置 limit 查询的别名,来看 limit()
:
注意,返回的是 $this,还是查询构造器。
再看集合中的 take,是从结果集中返回给定数量项的新集合。
现在知道什么时候加 get 了,总结一下:
- 要从查询构造器实例中获取结果时,加;
- 如果已经是个集合了,那再
->get()
是要出错的,除非加上参数,->get('key')
,则表示从结果集中返回指定键的条目; - 如果要限制数量,查询构造器和集合后面都可以跟
->take(N)
,但注意,两个 take 不是同一个方法。
本作品采用《CC 协议》,转载必须注明作者和本文链接