[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` 方法。
- 序言
- 发行版本说明
- 升级指南
- 贡献代码
- 开始
- 安装
- 配置
- Laravel Homestead
- 基础
- HTTP 路由
- HTTP 中间件
- HTTP 控制器
- HTTP 请求
- HTTP 响应
- 视图
- Blade 模板引擎
- 架构
- 一次请求的生命周期
- 应用目录结构
- 服务提供者
- 服务容器
- 门面(Facades)
- 数据库
- 起步
- 查询构建器
- 迁移
- 填充数据
- Eloquent ORM
- 起步
- 关联关系
- 集合
- 访问器&修改器
- 序列化
- 服务
- 用户认证
- 用户授权
- Artisan Console
- 订阅支付实现:Laravel Cashier
- 缓存
- 集合
- 集成前端资源:Laravel Elixir
- 加密
- 错误&日志
- 事件
- 文件系统/云存储
- 哈希
- 辅助函数
- 本地化
- 邮件
- 包开发
- 分页
- Redis
- 队列
- Session
- Envoy Task Runner
- 任务调度
- 测试
- 验证
- 新手入门指南
- 简单任务管理系统
- 带用户功能的任务管理系统