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 次