Khi làm việc với dữ liệu từ Eloquent hoặc Query Builder, Laravel cung cấp Collection để xử lý tập hợp kết quả thuận tiện hơn so với thao tác trực tiếp trên mảng PHP. Thay vì sử dụng nhiều vòng foreach để lọc, biến đổi, sắp xếp hoặc lấy một phần dữ liệu, Collection cung cấp sẵn nhiều phương thức giúp code ngắn gọn và dễ đọc hơn. Vậy Laravel Collection là gì, hoạt động như thế nào và những phương thức nào nên biết khi phát triển ứng dụng?
Laravel Collection là gì?
Laravel Collection là một lớp cung cấp các phương thức để thao tác với một tập hợp dữ liệu. Collection thường xuất hiện khi lấy nhiều bản ghi từ Eloquent hoặc khi chuyển một mảng PHP thành Collection.
Ví dụ, truy vấn Eloquent:
$users = User::all();
Biến $users trả về một Eloquent Collection chứa nhiều đối tượng User.
Bạn có thể tiếp tục xử lý dữ liệu:
$users = User::all();
$activeUsers = $users->where('status', 'active');
Ở đây, where() của Collection giúp lọc các phần tử theo điều kiện mà không cần viết thêm vòng lặp.
Collection đặc biệt hữu ích khi ứng dụng phải xử lý danh sách dữ liệu sau khi truy vấn từ database.

Collection hoạt động như thế nào trong Laravel?
Collection có thể được tạo từ một mảng thông qua collect():
$products = collect([
['name' => 'Laptop', 'price' => 1500],
['name' => 'Mouse', 'price' => 30],
['name' => 'Keyboard', 'price' => 80],
]);
Sau đó có thể sử dụng các phương thức của Collection:
$expensiveProducts = $products->filter(function ($product) {
return $product['price'] > 100;
});
Collection cũng thường được sử dụng trực tiếp với Eloquent:
$products = Product::where('status', 'active')->get();
Phương thức get() trả về Collection. Từ kết quả này, bạn có thể tiếp tục sử dụng filter(), map(), pluck(), sortBy() và nhiều phương thức khác.
Điểm đáng chú ý là Collection giúp tách truy vấn dữ liệu và xử lý dữ liệu trong PHP thành hai bước rõ ràng.
Các phương thức Collection thường dùng
Laravel có rất nhiều phương thức cho Collection, nhưng khi mới sử dụng, bạn chỉ cần nắm một số phương thức phổ biến.
map() biến đổi từng phần tử
map() dùng để tạo ra một Collection mới bằng cách biến đổi từng phần tử.
$prices = collect([100, 200, 300]);
$result = $prices->map(function ($price) {
return $price * 1.1;
});
Kết quả:
[110, 220, 330]
Phương thức này phù hợp khi cần thay đổi hoặc bổ sung dữ liệu trước khi trả về View hoặc API.
Ví dụ với danh sách sản phẩm:
$products = Product::all();
$result = $products->map(function ($product) {
return [
'name' => $product->name,
'price' => $product->price,
];
});
filter() lọc dữ liệu
filter() giữ lại những phần tử đáp ứng điều kiện:
$numbers = collect([10, 15, 20, 25]);
$result = $numbers->filter(function ($number) {
return $number >= 20;
});
Kết quả gồm:
20
25
Đây là một trong những phương thức thường xuyên được sử dụng khi xử lý danh sách dữ liệu sau khi truy vấn.
where() lọc theo giá trị
Với Collection chứa các phần tử dạng object hoặc array, where() giúp lọc theo một thuộc tính hoặc key:
$users = User::all();
$activeUsers = $users->where('status', 'active');
Nếu cần lọc nhiều điều kiện, có thể kết hợp nhiều phương thức:
$users = User::all();
$result = $users
->where('status', 'active')
->where('role', 'admin');
Cách viết này dễ đọc hơn việc tạo nhiều vòng lặp lồng nhau.
pluck() lấy một trường dữ liệu
Khi chỉ cần một thuộc tính cụ thể, pluck() là lựa chọn phù hợp:
$users = User::all();
$emails = $users->pluck('email');
Kết quả là Collection chỉ chứa danh sách email.
Bạn cũng có thể lấy dữ liệu theo dạng key-value:
$users = User::all();
$userList = $users->pluck('name', 'id');
Cách này hữu ích khi cần tạo dữ liệu cho <select>, danh sách lựa chọn hoặc các cấu trúc key-value.
first() lấy phần tử đầu tiên
first() trả về phần tử đầu tiên trong Collection:
$user = $users->first();
Có thể kết hợp với điều kiện:
$user = $users->first(function ($user) {
return $user->status === 'active';
});
Nếu không tìm thấy phần tử phù hợp, kết quả có thể là null.
sortBy() sắp xếp dữ liệu
sortBy() dùng để sắp xếp Collection theo một thuộc tính:
$products = Product::all();
$products = $products->sortBy('price');
Muốn sắp xếp giảm dần:
$products = $products->sortByDesc('price');
Tuy nhiên, nếu dữ liệu lớn và việc sắp xếp có thể thực hiện ngay tại database, nên cân nhắc dùng orderBy() trong truy vấn thay vì lấy toàn bộ dữ liệu về PHP rồi mới sắp xếp.
groupBy() nhóm dữ liệu
groupBy() giúp chia dữ liệu thành nhiều nhóm dựa trên một thuộc tính:
$products = Product::all();
$products = $products->groupBy('category_id');
Kết quả sẽ được chia thành các nhóm theo category_id.
Phương thức này phù hợp với những trường hợp cần chuẩn bị dữ liệu để hiển thị theo nhóm hoặc xử lý tiếp trong PHP.
Xử lý dữ liệu thực tế với Collection
Một ưu điểm của Collection là có thể chain nhiều phương thức liên tiếp.
Ví dụ cần lấy tên của những sản phẩm đang hoạt động, có giá từ 100 trở lên và sắp xếp theo giá giảm dần:
$products = Product::all()
->where('status', 'active')
->where('price', '>=', 100)
->sortByDesc('price')
->pluck('name');
Mỗi phương thức đảm nhiệm một bước:
Lấy dữ liệu
↓
Lọc trạng thái
↓
Lọc theo giá
↓
Sắp xếp
↓
Lấy tên sản phẩm
Cách viết này giúp quá trình xử lý dữ liệu dễ theo dõi và hạn chế những đoạn foreach dài.
Tuy nhiên, không nên hiểu rằng mọi thao tác đều nên thực hiện bằng Collection. Với dữ liệu lớn, cần cân nhắc đưa điều kiện lọc, sắp xếp hoặc giới hạn bản ghi xuống database để giảm lượng dữ liệu phải tải về ứng dụng.
Laravel Collection khác gì Array trong PHP?
Collection và Array đều có thể dùng để lưu danh sách dữ liệu, nhưng cách sử dụng khác nhau.
| Array PHP | Laravel Collection |
|---|---|
| Cấu trúc dữ liệu cơ bản | Lớp hỗ trợ xử lý tập hợp dữ liệu |
| Chủ yếu dùng hàm và cú pháp của PHP | Có nhiều method chuyên dụng |
Thường cần foreach cho xử lý phức tạp |
Có thể chain nhiều method |
| Không phụ thuộc Laravel | Gắn với hệ sinh thái Laravel |
| Phù hợp dữ liệu đơn giản | Phù hợp xử lý dữ liệu trong ứng dụng Laravel |
Ví dụ với Array:
$numbers = [10, 20, 30];
$result = [];
foreach ($numbers as $number) {
if ($number >= 20) {
$result[] = $number;
}
}
Với Collection:
$numbers = collect([10, 20, 30]);
$result = $numbers->filter(function ($number) {
return $number >= 20;
});
Collection không thay thế hoàn toàn Array. Nếu chỉ cần một cấu trúc dữ liệu đơn giản, Array vẫn rất phù hợp. Collection phát huy giá trị khi cần thực hiện nhiều thao tác trên một tập dữ liệu.

Khi nào nên sử dụng Laravel Collection?
Collection đặc biệt phù hợp trong các trường hợp:
- Xử lý danh sách bản ghi lấy từ Eloquent.
- Lọc hoặc biến đổi dữ liệu trước khi trả về View.
- Chuẩn bị dữ liệu cho API.
- Sắp xếp hoặc nhóm dữ liệu trong PHP.
- Kết hợp nhiều bước xử lý dữ liệu bằng method chaining.
- Viết code xử lý danh sách dễ đọc và dễ bảo trì hơn.
Nếu đang xây dựng ứng dụng Laravel và muốn nắm chắc cách dữ liệu được xử lý sau khi truy vấn, việc hiểu Collection là một phần quan trọng trong quá trình học. Bạn có thể tham khảo thêm các kiến thức về Laravel cơ bản để củng cố kiến thức nền trước khi đi sâu vào Eloquent và xử lý dữ liệu.
Tuy nhiên, cần tránh lạm dụng Collection. Với những truy vấn có điều kiện rõ ràng, đặc biệt khi dữ liệu lớn, nên xử lý ngay tại database:
$products = Product::where('status', 'active')
->orderByDesc('price')
->get();
Thay vì:
$products = Product::all()
->where('status', 'active')
->sortByDesc('price');
Cách đầu tiên cho phép database lọc và sắp xếp trước khi dữ liệu được đưa về ứng dụng, thường phù hợp hơn khi bảng có nhiều bản ghi.
Kết luận
Laravel Collection là công cụ giúp xử lý tập hợp dữ liệu bằng một hệ thống phương thức rõ ràng và linh hoạt. Những method như map(), filter(), where(), pluck(), sortBy() và groupBy() đáp ứng phần lớn nhu cầu xử lý dữ liệu thường gặp trong Laravel. Điểm quan trọng không phải là ghi nhớ tất cả method của Collection, mà là hiểu khi nào nên xử lý dữ liệu trong Collection và khi nào nên để database xử lý.
Nếu đang xây dựng nền tảng kiến thức Laravel từ cơ bản đến thực tế, Học Laravel có thể được sử dụng như một nguồn tham khảo để tiếp tục các chủ đề liên quan đến Eloquent, Query Builder, API và xử lý dữ liệu.

