Collection trong laravel rất mạnh mẽ

31

Chào các bạn,

Làm việc nhiều với Laravel framework, chúng ta đều thấy rằng nó không chỉ cung cấp mô hình MVC đơn giản, mà còn cung cấp nhiều thành phần mạnh mẽ khác như queue, gửi email, api xác thực,… Một trong số đó chính là Laravel Collection.

I. Laravel Collection là gì?

Giới thiệu một chút thì Laravel Collection là một lớp chứa các phương thức tập trung vào việc xử lý mảng.

Hiểu nhanh bạn có thể xem ví dụ sau:

<?php

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

$newNumbers = $numbers->map(function ($number) {
    return $number * 2;
})->filter(function ($number) {
    return $number > 4;
});

// [6, 8, 10]

II. Laravel Collection được sử dụng ở đâu?

Laravel Collection sinh ra không phải chỉ dành cho các developer, mà nó còn được sử dụng xuyên suốt trong toàn bộ dự án bao gồm cả các lớp nằm trong vendor/laravel. Đặc biệt Laravel Collection được thể hiện rõ nhất thông qua kết quả của các Model.

<?php

$users = \App\User::all();

// $users là một collection

$posts = \App\User::find(1)->posts;

// $posts là một collection

III. Tìm hiểu Laravel Collection

3.1 Khởi tạo Collection

Có 2 cách để bạn khởi tạo một Laravel Collection

<?php

// Khởi tạo thông qua helper collect
$collection = collect([1, 2, 3, 4]);

// Khởi tạo qua class Collection
$collection = new \Collection([1, 2, 3, 4, 5]);

3.2 Các phương thức có trong Laravel Collection

Laravel Collection có rất nhiều phương thức trong khi các phương thức này vẫn thường xuyên được bổ sung mỗi khi Laravel nâng cấp phiên bản. Vì vậy mình sẽ liệt kê một số phương thức mà mình hay sử dụng thôi nhé.

Nếu muốn xem tất cả thì bạn có thể xem ở đây.

all()

Phương thức all() trả về tất cả các phần tử có trong collection

<?php

collect([1, 2, 3])->all();

// [1, 2, 3]

first()

Phương thức first() trả về phần tử đầu tiên trong collection

<?php

collect([1, 2, 3, 4])->first();

// 1

collect([1, 2, 3, 4])->first(function ($value, $key) {
    return $value > 2;
});

// 3

push()

Phương thức push() sẽ thêm một phần tử mới vào cuối collection

<?php

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

$collection->push(5);

$collection->all();

// [1, 2, 3, 4, 5]

filter()

Phương thức filter() sẽ lọc các phần tử trong collection thỏa mãn điều kiện của callback

<?php

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

$filtered = $collection->filter(function ($value, $key) {
    return $value > 2;
});

$filtered->all();

// [3, 4]

pluck()

Phương thức pluck() sẽ trả về toàn bộ giá trị của một key của mỗi phần tử trong collection

<?php

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

$plucked = $collection->pluck('name');

$plucked->all();

// ['Desk', 'Chair']

where()

Phương thức where() sẽ lọc các phần tử trong collection theo điều kiện của một key nào đó

<?php

$collection = collect([
    ['product' => 'Desk', 'price' => 200],
    ['product' => 'Chair', 'price' => 100],
    ['product' => 'Bookcase', 'price' => 150],
    ['product' => 'Door', 'price' => 100],
]);

$filtered = $collection->where('price', 100);

$filtered->all();

/*
    [
        ['product' => 'Chair', 'price' => 100],
        ['product' => 'Door', 'price' => 100],
    ]
*/

Phương thức where() này sẽ chỉ so sánh giá trị mà bỏ qua kiểu dữ liệu, nghĩa là ‘1’ == 1 // true.

values()

Phương thức values() sẽ trả về giá một collection mới và reset các key thành các số nguyên liên tiếp

<?php

$collection = collect([
    10 => ['product' => 'Desk', 'price' => 200],
    11 => ['product' => 'Desk', 'price' => 200]
]);

$values = $collection->values();

$values->all();

/*
    [
        0 => ['product' => 'Desk', 'price' => 200],
        1 => ['product' => 'Desk', 'price' => 200],
    ]
*/

Rất nhiều các phương thức khác

Rất nhiều các phương thức khác nữa bạn có thể tham khảo thêm ở đây

IV. Laravel Collection VS các hàm PHP thuần

Không cần dùng tới Laravel Collection, trong PHP cũng có sẵn một số hàm tưng tự. Ví dụ như hàm array_map() tương tự với map() , array_filter() tương tự với filter() chẳng hạn. Vậy tại sao Laravel Collection ra đời trong khi các hàm của PHP vẫn đang được sử dụng tốt?

Theo mình, thì có 2 nguyên nhân:

  • Laravel Collection cung cấp cú pháp trong sáng hơn: Vì Laravel Collection cho phép bạn viết code kiểu $collection->methodA()->methodB()->methodC() trong khi đó nếu sử dụng các hàm PHP thuần thì bạn sẽ viết thành methodC(methodB(methodA($collection))). Rõ ràng với các viết của collection thì dễ đọc hơn là cách viết với các hàm PHP thuần.
  • Laravel Collection cung cấp nhiều phương thức tiện ích hơn: Điều này thì khỏi phải bàn cãi, Laravel Collection cung cấp nhiều phương thức tiện ích để xử lý mảng hơn so với PHP thuần. Vậy có thể nói Laravel Collection đang tuân theo triết lý
    Laravel collection = <Các hàm xử lý mảng của PHP> + <Các phương thức tiện ích khác>.
    Nếu tuân theo triết lý trên, thì việc nó có một số phương thức tương tự hàm trong PHP cũng là điều dễ hiểu.

IV. Kết luận

Collection trong Laravel rất mạnh mẽ, biết vận dụng Laravel Collection sẽ giúp code của bạn nhìn ngắn gọn hơn, trong sáng hơn. Tuy nhiên bạn nhớ đừng có lạm dụng, đừng có trường hợp xử lý mảng nào cũng ép thành collection. Nên nhớ rằng collection sẽ giúp code của bạn trong sáng hơn, vậy trong trường hợp PHP thuần vẫn đủ độ trong sáng thì bạn cũng không nhất thiết phải dùng tới collection.

Bài viết được viết dựa trên kinh nghiệm cá nhân, rất mong nhận được ý kiến đóng góp của các bạn.


Tài liệu tham khảo: https://laravel.com/docs/6.x/collections#available-methods