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;
});

// [3, 4, 5]

2.2 映射

1
2
3
4
5
$mapped = collect([1, 2, 3])->map(function ($value) {
return $value * 2;
});

// [2, 4, 6]

2.3 转换

1
2
3
4
5
6
7
8
$flattened = collect([[1, 2], [3, 4]])->flatten();
// [1, 2, 3, 4]

$plucked = collect([
['name' => 'John', 'age' => 30],
['name' => 'Jane', 'age' => 25],
])->pluck('name');
// ['John', 'Jane']

2.4 排序

1
2
3
4
5
6
7
8
9
10
$sorted = collect([3, 1, 2])->sort();
// [1, 2, 3]

$sortedDesc = collect([1, 2, 3])->sortDesc();
// [3, 2, 1]

$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');

// [
// 'admin' => [['name' => 'John', 'role' => 'admin'], ['name' => 'Bob', 'role' => 'admin']],
// 'user' => [['name' => 'Jane', 'role' => 'user']],
// ]

3.2 分块

1
2
$chunks = collect([1, 2, 3, 4, 5, 6])->chunk(2);
// [[1, 2], [3, 4], [5, 6]]

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);
// 10

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);
});
// [6, 8, 10]

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(); // 5
$collection->sum(); // 15
$collection->avg(); // 3
$collection->min(); // 1
$collection->max(); // 5

5.2 查找

1
2
3
4
5
6
7
8
9
$collection = collect([1, 2, 3, 4, 5]);

$collection->contains(3); // true
$collection->contains(6); // false

$collection->first(); // 1
$collection->first(fn($v) => $v > 2); // 3

$collection->last(); // 5

5.3 合并

1
2
3
4
5
6
7
8
$collection1 = collect([1, 2]);
$collection2 = collect([3, 4]);

$merged = $collection1->merge($collection2);
// [1, 2, 3, 4]

$combined = collect(['name', 'age'])->combine(['John', 30]);
// ['name' => 'John', 'age' => 30]

5.4 唯一值

1
2
3
4
5
6
7
$unique = collect([1, 1, 2, 2, 3])->unique();
// [1, 2, 3]

$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 集合提供了强大的数据处理能力:

  1. 丰富方法:过滤、映射、排序等
  2. 链式调用:简洁的数据处理管道
  3. 懒加载:高效处理大数据
  4. 性能优化:减少内存使用

参考资料