Bỏ qua đến nội dung chính

Laravel collection là gì? Các phương thức hay dùng kèm ví dụ

Giới thiệu Laravel collection: cách tạo, các phương thức hay dùng với kết quả đúng, phân trang bằng forPage, xử lý dữ liệu lớn với LazyCollection.

Tan Hien
Founder
Cập nhật 5 phút đọc
Chia sẻ:
Laravel collection là gì? Các phương thức hay dùng kèm ví dụ
Nội dung bài viết
  1. 1.Tạo collection
  2. 2.Nhóm phương thức biến đổi dữ liệu
  3. 2.1map: biến đổi từng phần tử
  4. 2.2pluck và keyBy: lấy một cột, đặt khóa
  5. 3.Nhóm phương thức lọc
  6. 3.1filter, reject và lưu ý về khóa
  7. 3.2where và unique
  8. 4.Sắp xếp, gom nhóm và tính toán
  9. 5.Lấy phần tử và chia nhỏ
  10. 6.Phân trang một collection
  11. 7.Xử lý dữ liệu lớn với LazyCollection
  12. 8.Collection hay truy vấn database?
  13. 8.1Kinh nghiệm từ Hozitech

Collection trong Laravel là class Illuminate\Support\Collection bọc một mảng PHP, cung cấp hàng trăm phương thức có thể nối chuỗi như map, filter, pluck, groupBy, sum. Tạo collection bằng helper collect(); kết quả truy vấn Eloquent get() cũng là một collection. Hầu hết phương thức trả về collection mới, không sửa collection gốc.

Bài viết giới thiệu cách tạo collection, các phương thức hay dùng kèm kết quả đúng, cách phân trang và xử lý dữ liệu lớn, theo tài liệu Collections của Laravel 13 (truy cập 01/10/2026).

Sáu nhóm phương thức Laravel collection hay dùng: biến đổi, lọc, sắp xếp và gom nhóm, tính toán, lấy phần tử, dữ liệu lớn
Các nhóm phương thức collection thường dùng trong dự án Laravel.

Tạo collection

// Từ mảng
$numbers = collect([1, 2, 3, 4, 5]);

// Kết quả truy vấn Eloquent đã là collection (Eloquent Collection)
$users = User::where('active', true)->get();

// Query builder cũng trả về collection, không cần bọc thêm collect()
$orders = DB::table('orders')->where('status', 'paid')->get();

Collection của Eloquent (Illuminate\Database\Eloquent\Collection) kế thừa collection thường và có thêm phương thức riêng cho model như load(), find(). Xem thêm cách truy vấn ở bài model trong Laravel.

Nhóm phương thức biến đổi dữ liệu

map: biến đổi từng phần tử

$multiplied = collect([1, 2, 3, 4, 5])->map(fn (int $item) => $item * 2);

$multiplied->all(); // [2, 4, 6, 8, 10]

pluck và keyBy: lấy một cột, đặt khóa

$products = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
]);

$products->pluck('name')->all();
// ['Desk', 'Chair']

$products->pluck('name', 'product_id')->all();
// ['prod-100' => 'Desk', 'prod-200' => 'Chair']

$products->keyBy('product_id');
// ['prod-100' => [...], 'prod-200' => [...]]

Nhóm phương thức lọc

filter, reject và lưu ý về khóa

$collection = collect([1, 2, 3, 4]);

$collection->filter(fn (int $value) => $value > 2)->all();
// [2 => 3, 3 => 4]  (giữ nguyên khóa gốc)

$collection->filter(fn (int $value) => $value > 2)->values()->all();
// [3, 4]  (đánh lại khóa từ 0)

$collection->reject(fn (int $value) => $value > 2)->all();
// [1, 2]

filter() giữ nguyên khóa của phần tử. Khi trả JSON cho frontend, khóa không liên tục sẽ biến mảng thành object, nên thường gọi thêm values().

where và unique

$orders->where('status', 'paid');
$orders->where('total', '>=', 500000);

collect([1, 1, 2, 2, 3, 4, 2])->unique()->values()->all();
// [1, 2, 3, 4]

Sắp xếp, gom nhóm và tính toán

$sorted = $products->sortBy('name');
$expensiveFirst = $products->sortByDesc('price');

$byAccount = collect([
    ['account_id' => 'account-x10', 'product' => 'Chair'],
    ['account_id' => 'account-x10', 'product' => 'Bookcase'],
    ['account_id' => 'account-x11', 'product' => 'Desk'],
])->groupBy('account_id');
// ['account-x10' => [Chair, Bookcase], 'account-x11' => [Desk]]

collect([1, 2, 3, 4, 5])->sum();   // 15
collect([1, 1, 2, 4])->avg();      // 2
collect([1, 2, 3])->reduce(fn (?int $carry, int $item) => $carry + $item); // 6

[$underThree, $rest] = collect([1, 2, 3, 4, 5, 6])->partition(fn (int $i) => $i < 3);
// $underThree: [1, 2]

Với collection Eloquent, có thể truyền tên cột: $orders->sum('total'), $orders->groupBy('status').

Lấy phần tử và chia nhỏ

collect([1, 2, 3, 4])->first(fn (int $value) => $value > 2); // 3

collect(['name' => 'Desk', 'price' => 100])->contains('Desk'); // true

collect([1, 2, 3, 4, 5, 6, 7])->chunk(4)->all();
// [[1, 2, 3, 4], [5, 6, 7]]

Phân trang một collection

Collection không có phương thức paginate(); phương thức này thuộc query builder và Eloquent. Với dữ liệu lấy từ database, hãy phân trang ngay trong truy vấn (Post::paginate(10)) để chỉ tải đúng số bản ghi cần. Nếu dữ liệu đã nằm trong collection (ví dụ kết quả gọi API), dùng forPage():

collect([1, 2, 3, 4, 5, 6, 7, 8, 9])->forPage(2, 3)->all();
// [4, 5, 6]  (trang 2, mỗi trang 3 phần tử)

Cần thanh phân trang đầy đủ trong view thì tạo LengthAwarePaginator từ collection đó. Chi tiết phân trang trong Laravel xem bài Laravel pagination.

Xử lý dữ liệu lớn với LazyCollection

Collection thường nạp toàn bộ dữ liệu vào bộ nhớ. Với hàng chục nghìn bản ghi, dùng cursor() của Eloquent (trả về LazyCollection) để đọc từng bản ghi một, hoặc chuyển collection sang dạng lười bằng lazy():

foreach (User::where('active', true)->cursor() as $user) {
    // Mỗi lần chỉ giữ một model trong bộ nhớ
}

$count = $hugeCollection
    ->lazy()
    ->where('country', 'VN')
    ->count();

Collection hay truy vấn database?

Collection không làm truy vấn nhanh hơn; nó xử lý dữ liệu đã tải về bộ nhớ PHP. Lọc, đếm, tính tổng trên bảng lớn nên làm bằng truy vấn (where, count(), sum() của query builder) để database xử lý. Collection phù hợp khi dữ liệu đã có sẵn và không quá lớn: định dạng lại để trả API, gom nhóm hiển thị, tính toán phụ trên kết quả đã phân trang.

// Tốn bộ nhớ: tải mọi đơn hàng rồi mới cộng
$total = Order::all()->sum('total');

// Tốt hơn: database tự tính
$total = Order::sum('total');

Kinh nghiệm từ Hozitech

Website Hozitech chạy trên Laravel. Lỗi hiệu năng hay gặp trong code Laravel là gọi ->get() hoặc ::all() rồi mới filter(), count() bằng collection; trên bảng vài trăm bản ghi thì không sao, nhưng khi dữ liệu tăng, trang chậm và tốn RAM rõ rệt. Quy tắc đơn giản: lọc và đếm ở database, định dạng và trình bày bằng collection. Để nắm tổng quan framework, xem Laravel là gì.

Tan Hien

Về tác giả

Founder

Xin chào mình là Hiền hiện đang là Founder của Hozitech. Mình là kỹ sư phần mềm có hơn 9+ năm kinh nghiệm trong lĩnh vực thiết kế website, ứng dụng di động... Gần đây mình đang nghiên cứu thêm về lĩnh vực marketing. Mình rất vui khi được chia sẽ những kiến thức và kinh nghiệm của mình đến mọi người!

Câu hỏi thường gặp

Câu hỏi thường gặp

Sẵn sàng bắt đầu dự án của bạn?

Hãy để chúng tôi giúp bạn biến ý tưởng thành hiện thực. Đăng ký tư vấn miễn phí ngay hôm nay để nhận được giải pháp công nghệ tối ưu cho doanh nghiệp.