Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 23: Collection trong Laravel 8

Tiếp tục với series, phần này mình sẽ giới thiệu với mợi người về collection trong Laravel 8, một trong những feature được dùng rất là nhiều trong Laravel.

1. Collection trong Laravel là gì?

Collection là một class cung cấp các phương thức để làm việc với dữ liệu mảng một cách đơn giản, thuận tiện.

Bạn có thể xem qua ví dụ sau:

$collection = collect(['taylor', 'abigail', null])->map(function ($name) {
    return strtoupper($name);
})->reject(function ($name) {
    return empty($name);
});

Ở ví dụ trên mình sử dụng collection trong Laravel thực hiện chuyển đổi tất cả các phần tử trong mảng thành in hoa và đồng thời loại bỏ các phần tử null trong mảng. Các bạn có thấy nó tiện không?

2. Tạo collection trong Laravel.

Để tạo ra một collection trong Laravel cũng rất đơn giản, chúng ta có 3 cách chính để tạo ra một collection trong Laravel.

Cách 1: Sử dụng helper collect.

Bạn có thể sử dụng helper collect để tạo ra collection như ở ví dụ trên.

VD: Tạo collect sử dụng helper collect.

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

Cách 2: Sử dụng new Collection()

Bạn cũng có thể tạo collection trong Laravel bằng cách khởi tạo luôn object từ class Collection.

VD:

use Illuminate\Support\Collection;

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

Cách 3: Sử dụng Collection::make();

Bạn cũng có thể khởi tạo object bằng cách sử dụng static method trong Collection

VD:

use Illuminate\Support\Collection;

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

Trong tất cả cách cách trên thì dữ liệu đầu vào các bạn có thể bỏ trống để tạo ra một collection rỗng.

3. Các phương thức hỗ trợ trong Collection.

Trong collection Laravel hỗ trợ rất nhiều phương thức (khoảng gần 150 phương thức) để các bạn có thể xử lý mảng dữ liệu bên trong.

Vì khá là nhiều phương thức, nên mình chỉ list ra một số các phương thức thường được sử dụng thôi còn ai muốn xem chi tiết có thể xem tại đây.

all

Phương thức này sẽ trả về rất cả các phần tử đang có trong collection.

VD:

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

// [1, 2, 3]

avg(),average()

Phương thức này sẽ trả về giá trị trung bình của các phần tử có trong mảng theo key.

VD:

$average = collect([1, 1, 2, 4])->avg();

// 2

VD: Mảng lồng nhau.

$average = collect([
    ['foo' => 10],
    ['foo' => 10],
    ['foo' => 20],
    ['foo' => 40]
])->avg('foo');

// 20

chunk()

Phương thức này sẽ break các giá trị bên trong collection ra thành các mảng con theo size quy định.

VD:

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

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

$chunks->all();

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

collapse()

Phương thức này sẽ làm phẳng các mảng con bên trong thành một mảng duy nhất.

VD:

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

$collapsed = $collection->collapse();

$collapsed->all();

// [1, 2, 3, 4, 5, 6, 7, 8, 9]

collect()

Phương thức này sẽ trả về một collection mới với các giá trị trong collection hiện tại.

VD:

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

$collectionB = $collectionA->collect();

$collectionB->all();

// [1, 2, 3]

concat()

Phương thức này sẽ nối các giá trị vào cuối của mảng trong collection.

VD:

$collection = collect(['John Doe']);

$concatenated = $collection->concat(['Jane Doe'])->concat(['name' => 'Johnny Doe']);

$concatenated->all();

// ['John Doe', 'Jane Doe', 'Johnny Doe']

contains()

Phương thức này sẽ kiểm tra xem một value nào đó có tồn tại trong collection hay không.

VD:

$collection = collect(['name' => 'Desk', 'price' => 100]);

$collection->contains('Desk');

// true

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

// false

VD: Với tham số truyền vào là nhiều giá trị.

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

$collection->contains('product', 'Bookcase');

// false

VD: Với tham số truyền vào là một closure.

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

$collection->contains(function ($value, $key) {
    return $value > 5;
});

// false

count()

Phương thức này sẽ trả về số lượng phần tử đang có trong collection.

VD:

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

$collection->count();

// 4

dd()

Phương thức này sẽ dump ra các giá trị đang có trong mảng.

diff()

Phương thức này sẽ trả về các giá trị khác nhau giữa hai mảng data.

VD:

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

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

$diff->all();

// [1, 3, 5]

each()

Phương thức này sẽ lặp các giá trị trong collection và thực thi logic trong closure.

VD:

$collection->each(function ($item, $key) {
    if (/* condition */) {
        return false;
    }
});

filter()

Phương thức này sẽ lặp qua các phần từ trong collection và thực thi logic trong closure, nếu closure trả về false thì phần tử này sẽ không được trả về trong kết quả.

VD:

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

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

$filtered->all();

// [3, 4]

VD:

$collection = collect([1, 2, 3, null, false, '', 0, []]);

$collection->filter()->all();

// [1, 2, 3]

first()

Phần tử này sẽ trả về giá trị đầu tiên pass với điều kiện trong closure.

VD: Với không có tham số truyền vào.

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

// 1

VD: Với có tham số truyền vào.

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

// 3

flip()

Phương thức này sẽ đảo ngược các giá trị key, array trong mảng.

VD:

$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);

$flipped = $collection->flip();

$flipped->all();

// ['taylor' => 'name', 'laravel' => 'framework']

get()

Phương thức này sẽ trả về các giá trị tương ướng với key truyền vào, nếu không tồn tại nó sẽ trả về null.

VD:

$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);

$value = $collection->get('name');

// taylor

sum()

Phương thức này sẽ trả về tổng các giá trị của các phần tử trong collection, sử dụng như phương thức avg().

min()

Phương thức này sẽ trả về giá trị nhỏ nhất của các phần tử trong collection sử dụng tương tự như phương thức avg().

max()

Phương thức này sẽ trả về giá trị lớn nhất của các phần tử trong collection sử dụng tương tự như phương thức avg().

toArray()

Phương thức này sẽ convert collection về dạng array.

VD:

$collection = collect(['name' => 'Desk', 'price' => 200]);

$collection->toArray();

/*
    [
        ['name' => 'Desk', 'price' => 200],
    ]
*/

toJson()

Phương thức này sẽ convert collection về dạng JSON string.

VD:

$collection = collect(['name' => 'Desk', 'price' => 200]);

$collection->toJson();

// '{"name":"Desk", "price":200}'

4. Kế thừa collection.

Collection trong Laravel đã hỗ trợ chúng ta rất nhiều phương thức. Tuy nhiên, nếu bạn cần tạo thêm phương thức cho collection thì Laravel cũng hỗ trợ bạn.

Bạn có thể sử dụng phương thức macro để tạo thêm phương thức với cú pháp:

Collection::macro($methodName, $closure);

Trong đó:

  • $methodName là tên của phương thức bạn muốn thêm.
  • $closure là một callback function chứa logic xử lý của phương thức.

VD: Tạo mới phương thức toUpper cho collection.

Collection::macro('toUpper', function () {
    return $this->map(function ($value) {
        return Str::upper($value);
    });
});

Lúc này ở collection các bạn có thể gọi như bình thường.

$collection = collect(['first', 'second']);

$upper = $collection->toUpper();

// ['FIRST', 'SECOND']

VD: Macro với tham số truyền vào.

use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Lang;
use Illuminate\Support\Str;

Collection::macro('toLocale', function ($locale) {
    return $this->map(function ($value) use ($locale) {
        return Lang::get($value, [], $locale);
    });
});

$collection = collect(['first', 'second']);

$translated = $collection->toLocale('es');

5. LazyCollection

Collection trong Laravel đã là đủ mạnh mẽ rồi. Nhưng nếu như bạn muốn sử dụng collection với dữ liệu lớn bạn có thể xem xét sử dụng LazyCollection. Class này được base trên PHP generator nên nó sử dụng rất ít tài nguyên.

Để tạo LazyCollection các bạn sử dụng cú pháp:

LazyCollection::make();

Còn lại các phương thức các bạn có thể sử dụng giống như collection.

VD:

use Illuminate\Support\LazyCollection;

LazyCollection::make(function () {
    $handle = fopen('log.txt', 'r');

    while (($line = fgets($handle)) !== false) {
        yield $line;
    }
});

6. Lời kết.

Collection được sử dụng rất nhiều ở trong Laravel, thế nên các bạn cần lắm rõ một số phương thức hay dùng để đỡ phải lên search docs.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

0 Comments

Bài viết chưa có ai bình luận, hãy là người đầu tiên đi bạn!

Bình luận

Captcha