🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### **1、简介** [Eloquent](http://laravelacademy.org/tags/eloquent "View all posts in Eloquent") 返回的所有的包含多条记录的[结果集](http://laravelacademy.org/tags/%e7%bb%93%e6%9e%9c%e9%9b%86 "View all posts in 结果集")都是 `Illuminate\Database\Eloquent\[Collection](http://laravelacademy.org/tags/collection "View all posts in Collection")` 对象的实例,包括通过 `get` 方法或者通过访问关联关系获取的结果。Eloquent [集合](http://laravelacademy.org/tags/%e9%9b%86%e5%90%88 "View all posts in 集合")对象继承自 [Laravel](http://laravelacademy.org/tags/laravel "View all posts in Laravel") 的集合基类,因此很自然的继承了很多处理 Eloquent 模型底层数组的方法。 当然,所有集合也是迭代器,允许你像数组一样对其进行循环: ~~~ $users = App\User::where('active', 1)->get(); foreach ($users as $user) { echo $user->name; } ~~~ 然而,集合使用直观的接口提供了各种映射/简化操作,因此比数组更加强大。例如,我们可以通过以下方式移除所有无效的模型并聚合还存在的用户的名字: ~~~ $users = App\User::where('active', 1)->get(); $names = $users->reject(function ($user) { return $user->active === false; })->map(function ($user) { return $user->name; }); ~~~ > 注意:尽管大多数 Eloquent 集合返回的是一个新的 Eloquent 集合实例,但是`pluck`、`keys`、`zip`、`collapse`、`flatten`和`flip`方法返回的是集合基类实例。 ### **2、可用方法** 所有的 Eloquent 集合继承自 Laravel 集合对象基类,因此,它们继承所有集合基类提供的强大方法: [all](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_3) [chunk](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_4) [collapse](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_5) [contains](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_6) [count](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_7) [diff](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_8) [each](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_9) [filter](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_10) [first](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_11) [flatten](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_12) [flip](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_13) [forget](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_14) [forPage](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_15) [get](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_16) [groupBy](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_17) [has](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_18) [implode](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_19) [intersect](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_20) [isEmpty](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_21) [keyBy](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_22) [keys](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_23) [last](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_24) [map](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_25) [merge](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_26) [pluck](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_27) [pop](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_28) [prepend](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_29) [pull](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_30) [push](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_31) [put](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_32) [random](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_33) [reduce](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_34) [reject](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_35) [reverse](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_36) [search](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_37) [shift](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_38) [shuffle](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_39) [slice](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_40) [sort](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_41) [sortBy](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_42) [sortByDesc](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_43) [splice](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_44) [sum](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_45) [take](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_46) [toArray](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_47) [toJson](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_48) [transform](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_49) [unique](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_50) [values](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_51) [where](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_52) [whereLoose](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_53) [zip](http://laravelacademy.org/post/178.html#ipt_kb_toc_178_54) ### **3、[自定义](http://laravelacademy.org/tags/%e8%87%aa%e5%ae%9a%e4%b9%89 "View all posts in 自定义")集合** 如果你需要在自己扩展的方法中使用自定义的集合对象,可以重写模型上的 `newCollection` 方法: ~~~ <?php namespace App; use App\CustomCollection; use Illuminate\Database\Eloquent\Model; class User extends Model{ /** * 创建一个新的Eloquent集合实例 * * @param array $models * @return \Illuminate\Database\Eloquent\Collection */ public function newCollection(array $models = []) { return new CustomCollection($models); } } ~~~ 定义好 `newCollection` 方法后,无论何时 Eloquent 返回该模型的 `Collection` 实例你都会获取到自定义的集合。如果你想要在应用中的每一个模型中使用自定义集合,需要在模型基类中重写 `newCollection` 方法。