Laravel 集合 Collections 实战:用高阶函数把数据变换写成流水线
test12026-10-210 次阅读
为什么用 Collection
数组在 PHP 里能干的事有限,且处理多步变换时要写一堆 foreach。Laravel 的 Collection 提供了一整套链式高阶函数,把“过滤、分组、映射、聚合”拼成一条流水线,读起来就是业务意图本身。数据库查询得到的也是 Collection,Eloquent 的关联集合同样支持这些方法。
map / filter / groupBy / sum 组合
下面把一笔订单集合按“已支付”过滤、按用户分组、再算出每人的笔数与金额。
use Illuminate\Support\Collection;
$orders = collect([
['user' => 'alice', 'amount' => 120, 'paid' => true],
['user' => 'bob', 'amount' => 80, 'paid' => false],
['user' => 'alice', 'amount' => 60, 'paid' => true],
]);
$report = $orders
->where('paid', true)
->groupBy('user')
->map(fn (Collection $items, string $user) => [
'user' => $user,
'count' => $items->count(),
'amount' => $items->sum('amount'),
])
->values();
// 结果:alice 两笔共 180
用 pipe 串联自定义步骤
当某一步逻辑较复杂、不想塞进 map 的闭包里时,用 pipe 把集合交给一个函数处理,保持链式可读。
$report = $orders
->pipe(fn (Collection $c) => $c->where('paid', true))
->pipe(fn (Collection $c) => $c->groupBy('user'))
->map(fn (Collection $items) => $items->sum('amount'));
与数据库集合的关系与注意点
- DB::table 或 Eloquent 查出来就是 Collection,上面所有方法都能直接用。
- 聚合尽量下推到数据库(where/sum),只在内存里做“已经查回来的少量数据”的变换。
- 避免在集合里对每项再发起查询,那会把 N+1 隐患从 SQL 层搬到了 PHP 层;先用 whereIn 把数据一次性取回,再在集合里处理。
- 需要下标、分页、分块落库时,用 chunk/partition 等方法,别一次性把全表读进内存。
T
test1
文章作者
为什么用 Collection 数组在 PHP 里能干的事有限,且处理多步变换时要写一堆 foreach。Laravel...
- 分类
- 技术
- 发布时间
- 2026-10-21
- 字数
- 约 1301 字
- 阅读
- 0 次
