Laravel 集合(Collection)是一个封装了数组操作的高级数据结构,继承自 PHP 的ArrayObject
,提供了 100 + 个便捷方法来处理数据。集合的核心特点:
- 面向对象接口:通过方法链式调用实现数据操作
- 数据不可变性:大多数操作会返回新集合(除非显式修改)
- 与数组兼容:支持数组语法(如
$collection[0]
)和集合方法混用
场景 |
数组实现 |
集合实现 |
过滤数据 |
foreach + if |
$coll->filter(...) |
转换数据 |
array_map |
$coll->map(...) |
分组统计 |
多层循环 + 条件判断 |
$coll->groupBy('category')->count() |
数据库查询结果处理 |
遍历数组操作 |
DB::table()->get()->map(...) |
链式操作 |
需分步操作 |
->where()->sortBy()->pluck() |
核心优势:
- 代码可读性提升:方法名直观(如
contains
, avg
)
- 减少样板代码:内置常用操作,避免重复造轮子
- 与 Eloquent 集成:数据库查询默认返回集合
- 更好的 IDE 支持:方法提示和类型约束
// 基础创建
collect([1,2,3]);
// 数据库创建
DB::table('users')->get(); // 返回Eloquent集合
$coll->first(); // 第一个元素
$coll->last(); // 最后一个元素
$coll->get(2); // 索引访问
$coll->keys(); // 获取所有键名
// 条件过滤
$coll->where('age', '>', 18);
// 保留符合条件的元素
$coll->filter(fn($item) => $item->active);
// 排除特定元素
$coll->reject(fn($item) => $item->trashed);
// 值转换
$coll->map(fn($user) => $user->email);
// 提取字段
$coll->pluck('name', 'id'); // 转为关联数组
// 合并集合
$coll->merge($anotherColl);
// 自然排序
$coll->sort();
// 自定义排序
$coll->sortByDesc('created_at');
// 分组统计
$coll->groupBy('status')->each(fn($group) => count($group));
$coll->sum('price'); // 总和
$coll->avg('rating'); // 平均值
$coll->max('age'); // 最大值
$coll->min('height'); // 最小值
// 去重
$coll->unique('email');
// 交集与差集
$coll->intersect($anotherColl);
$coll->diff($anotherColl);
// 随机抽样
$coll->random(3); // 随机取3个元素
- 数据库结果处理:
User::where('active', true)
->get()
->map(fn($user) => $user->name)
->implode(', ');
- 复杂数据转换:
$orders->groupBy('user_id')
->map(fn($group) => [
'user' => $group->first()->user,
'total' => $group->sum('amount')
]);
- 数据验证过滤:
$validData = $request->validated()
->only('email', 'name')
->filter();
- 延迟加载:使用
lazy()
方法处理大数据集
- 方法选择:优先使用
where()
而非filter()
进行精确匹配
- 内存管理:处理超大数据时建议使用
chunk()
分块处理
集合是 Laravel 生态的核心组件,掌握其使用可以显著提升数据处理效率和代码可维护性。建议通过
官方文档深入学习更多高级方法。