Laravel Collection

Định nghĩa

Collection trong Laravel là một class được tích hợp sẵn các phương thức thường xuyên được sử dụng để xử lý dữ liệu nhàm giảm thiểu tối đa thời gian cho các lập trình viên. Đặc biệt là khi làm việc với API kết nối với database vì dữ liệu từ database trả về sẵn kiểu là Collection.

Khai báo và cách sử dụng

Trước tiên, muốn sử dụng được collection bạn cần khai báo namespace của nó. Hãy thêm dòng này vào đầu file php của bạn.

    use Illuminate\Support\Collection;

Sau đó, bạn có thể tạo collection bằng 1 trong 2 cách sau đây.

//Tạo collection từ mảng
$collection = collect([1, 2, 3]);

$collection = Collection::make([1, 2, 3]);

Lúc này, nếu bạn sử dụng hàm prinf_r($collection) thì PHP sẽ trả về cho chúng ta một object có chứa giá trị tương ứng mà ta đã truyền vào.

Một số hàm hay dùng

1. Listing

  • all(): Lấy ra tất cả giá trị có trong collection và trả về dưới dạng mảng.
    collect([1, 2, 3])->all();
    // Output: [1, 2, 3]
  • avg(): Trả về giá trị trung bình của tất cả các giá trị có trong collection.
    collect([1, 2, 3, 4, 5])->avg();
    // Output: 3

Nếu collection là một mảng lồng nhau hoặc là một object, Bạn cần phải truyền vào giá trị của key để xác định giá trị dùng để tính trung bình

    $collection = collect([
        ['name' => 'JavaScript: The Good Parts', 'pages' => 176],
        ['name' => 'JavaScript: The Definitive Guide', 'pages' => 1096],
    ]);

    $collection->avg('pages');
    // Output: 636
  • chunk(): Hàm này chia collection ra thành các collection nhỏ hơn.
    $collection = collect([1, 2, 3, 4, 5, 6, 7]);

    $chunks = $collection->chunk(4);

    $chunks->toArray();
    // Output: [[1, 2, 3, 4], [5, 6, 7]]

Hàm này vô cùng hữu dụng trong views khi bạn làm việc với 'grid system'. Tưởng tượng bạn đang có một collection của Eloquent. Bạn cần hiển thị nó với grid layout:

    @foreach ($products->chunk(3) as $chunk)
        <div class="row">
            @foreach ($chunk as $product)
                <div class="col-xs-4">{{ $product->name }}</div>
            @endforeach
        </div>
    @endforeach
  • collapse(): Biến 1 collection của nhiều mảng thành collection của một mảng.
    $collection = collect([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);

    $collapsed = $collection->collapse();

    $collapsed->all();

    // Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]
  • contains(): Phương pháp xác định collection có chứa 1 item nhất định hay không?
    $collection = collect(['name' => 'Desk', 'price' => 100]);

    $collection->contains('Desk');

    // true

    $collection->contains('New York');

    // false
  • count(): Trả về tổng số item có trong collection.
    $collection = collect([1, 2, 3, 4]);

    $collection->count();
    // Output: 4
  • diff(): So sánh 2 collection với nhau hoặc collection với một mảng trong array.
    $collection = collect([1, 2, 3, 4, 5]);

    $diff = $collection->diff([2, 4, 6, 8]);

    $diff->all();

    // Output: [1, 3, 5]
  • filter(): Hàm này sẽ duyệt từ đầu tới cuối của collection. Nó chỉ giữ lại giá trị nào thỏa mãn điều kiện lọc. giá trị k thoả mãn sẽ bị loại bỏ.
    $collection = collect([1, 2, 3, 4]);

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

    $filtered->all();

    // [3, 4]
  • first(): Trả về giá trị đầu tiên của collection.
    collect([1, 2, 3, 4])->first();

    // Output: 1

Tương tự như hàm filter(). Bạn cũng có thể truyền điều kiện vào hàm first() như sau.

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

    // 3
  • groupBy(): Gộp các item của collection theo 1 key nhất định
    $collection = collect([
        ['account_id' => 'account-x10', 'product' => 'Chair'],
        ['account_id' => 'account-x10', 'product' => 'Bookcase'],
        ['account_id' => 'account-x11', 'product' => 'Desk'],
    ]);

    $grouped = $collection->groupBy('account_id');

    $grouped->toArray();

    /*
        [
            'account-x10' => [
                ['account_id' => 'account-x10', 'product' => 'Chair'],
                ['account_id' => 'account-x10', 'product' => 'Bookcase'],
            ],
            'account-x11' => [
                ['account_id' => 'account-x11', 'product' => 'Desk'],
            ],
        ]
    */
  • has(): Cho phép kiểm tra một item có tồn tịa trong collection hay không?
    $collection = collect(['account_id' => 1, 'product' => 'Desk']);

    $collection->has('email');

    // false
  • implode(): Kết hợp item trong 1 collection.
    $collection = collect([
        ['account_id' => 1, 'product' => 'Desk'],
        ['account_id' => 2, 'product' => 'Chair'],
    ]);

    $collection->implode('product', ', ');

    // Desk, Chair
  • isEmpty(): Trả về true nếu collection rỗng. Trả về false nếu collection khác rỗng.
    collect([])->isEmpty();

    // true

Trên đây là một số hàm thường được dùng. Tất cả các hàm của collection có tại đây: Collection Method

Chúc các bạn thành công. ^^