Laravel 13 集合新方法详解
摘要
Laravel 集合提供了丰富的数据处理方法。本文将深入讲解 Laravel 13 的集合方法,包括:
- 基础集合操作
- 高级数据处理
- 懒加载集合
- 集合性能优化
- 实战案例与最佳实践
本文适合希望掌握集合高效处理的 Laravel 开发者。
1. 创建集合
1.1 基本创建
1 2 3 4 5
| use Illuminate\Support\Collection;
$collection = collect([1, 2, 3, 4, 5]);
$collection = Collection::make([1, 2, 3, 4, 5]);
|
1.2 从模型创建
1 2 3
| $users = User::all();
$users = User::where('active', true)->get();
|
2. 基础方法
2.1 过滤
1 2 3 4 5
| $filtered = collect([1, 2, 3, 4, 5])->filter(function ($value) { return $value > 2; });
|
2.2 映射
1 2 3 4 5
| $mapped = collect([1, 2, 3])->map(function ($value) { return $value * 2; });
|
2.3 转换
1 2 3 4 5 6 7 8
| $flattened = collect([[1, 2], [3, 4]])->flatten();
$plucked = collect([ ['name' => 'John', 'age' => 30], ['name' => 'Jane', 'age' => 25], ])->pluck('name');
|
2.4 排序
1 2 3 4 5 6 7 8 9 10
| $sorted = collect([3, 1, 2])->sort();
$sortedDesc = collect([1, 2, 3])->sortDesc();
$sortedBy = collect([ ['name' => 'John', 'age' => 30], ['name' => 'Jane', 'age' => 25], ])->sortBy('age');
|
3. 高级方法
3.1 分组
1 2 3 4 5 6 7 8 9 10
| $grouped = collect([ ['name' => 'John', 'role' => 'admin'], ['name' => 'Jane', 'role' => 'user'], ['name' => 'Bob', 'role' => 'admin'], ])->groupBy('role');
|
3.2 分块
1 2
| $chunks = collect([1, 2, 3, 4, 5, 6])->chunk(2);
|
3.3 分区
1 2 3 4 5 6 7
| [$underThirty, $overThirty] = collect([ ['name' => 'John', 'age' => 30], ['name' => 'Jane', 'age' => 25], ['name' => 'Bob', 'age' => 35], ])->partition(function ($item) { return $item['age'] < 30; });
|
3.4 归约
1 2 3 4
| $sum = collect([1, 2, 3, 4])->reduce(function ($carry, $item) { return $carry + $item; }, 0);
|
3.5 管道
1 2 3 4 5 6 7 8
| $result = collect([1, 2, 3, 4, 5]) ->pipe(function ($collection) { return $collection->filter(fn($v) => $v > 2); }) ->pipe(function ($collection) { return $collection->map(fn($v) => $v * 2); });
|
4. 懒加载集合
4.1 创建懒加载集合
1 2 3 4 5 6 7 8 9
| use Illuminate\Support\LazyCollection;
LazyCollection::make(function () { for ($i = 0; $i < 1000000; $i++) { yield $i; } })->each(function ($number) { });
|
4.2 处理大文件
1 2 3 4 5 6 7 8 9 10 11
| LazyCollection::make(function () { $handle = fopen('large-file.csv', 'r'); while ($line = fgets($handle)) { yield str_getcsv($line); } fclose($handle); })->chunk(1000)->each(function ($lines) { });
|
4.3 数据库游标
1 2 3 4 5
| User::cursor()->filter(function ($user) { return $user->active; })->each(function ($user) { });
|
5. 实用方法
5.1 统计
1 2 3 4 5 6 7
| $collection = collect([1, 2, 3, 4, 5]);
$collection->count(); $collection->sum(); $collection->avg(); $collection->min(); $collection->max();
|
5.2 查找
1 2 3 4 5 6 7 8 9
| $collection = collect([1, 2, 3, 4, 5]);
$collection->contains(3); $collection->contains(6);
$collection->first(); $collection->first(fn($v) => $v > 2);
$collection->last();
|
5.3 合并
1 2 3 4 5 6 7 8
| $collection1 = collect([1, 2]); $collection2 = collect([3, 4]);
$merged = $collection1->merge($collection2);
$combined = collect(['name', 'age'])->combine(['John', 30]);
|
5.4 唯一值
1 2 3 4 5 6 7
| $unique = collect([1, 1, 2, 2, 3])->unique();
$uniqueBy = collect([ ['name' => 'John', 'role' => 'admin'], ['name' => 'Jane', 'role' => 'admin'], ])->unique('role');
|
6. 实战案例
6.1 数据转换管道
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class DataTransformer { public function transform(array $data): array { return collect($data) ->filter(fn($item) => !empty($item['email'])) ->map(function ($item) { return [ 'name' => trim($item['name']), 'email' => strtolower($item['email']), 'created_at' => now(), ]; }) ->unique('email') ->values() ->toArray(); } }
|
6.2 报表生成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class SalesReport { public function generate(Collection $orders) { return [ 'total' => $orders->sum('total'), 'count' => $orders->count(), 'average' => $orders->avg('total'), 'by_status' => $orders->groupBy('status') ->map(fn($orders) => $orders->sum('total')), 'top_customers' => $orders->groupBy('customer_id') ->map(fn($orders) => $orders->sum('total')) ->sortDesc() ->take(10), ]; } }
|
7. 最佳实践
7.1 链式调用
1 2 3 4 5 6 7 8 9 10 11
| $result = collect($data) ->filter(fn($item) => $item['active']) ->map(fn($item) => $item['name']) ->unique() ->values();
$data = collect($data); $data = $data->filter(fn($item) => $item['active']); $data = $data->map(fn($item) => $item['name']);
|
7.2 使用懒加载
1 2 3 4 5 6 7
| User::cursor() ->filter(fn($user) => $user->active) ->chunk(1000) ->each(function ($users) { });
|
8. 总结
Laravel 集合提供了强大的数据处理能力:
- 丰富方法:过滤、映射、排序等
- 链式调用:简洁的数据处理管道
- 懒加载:高效处理大数据
- 性能优化:减少内存使用
参考资料