Collection trong Laravel
Việc làm việc với mảng trong Laravel 8 trởn nên đơn giản và dễ dàng hơn với Collection trong Laravel 8
Trong hướng dẫn này chúng ta cùng đi tìm hiểu về collection trong Laravel 8, một trong những tính năng được dùng rất là nhiều trong Laravel.
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:
Ví dụ
$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?
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
.
Ví dụ
$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:
Ví dụ
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:
Ví dụ
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.
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:
Ví dụ
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.
Ví dụ
$average = collect([1, 1, 2, 4])->avg();
// 2
VD: Mảng lồng nhau.
Ví dụ
$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:
Ví dụ
$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:
Ví dụ
$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:
Ví dụ
$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:
Ví dụ
$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:
Ví dụ
$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ị.
Ví dụ
$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.
Ví dụ
$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.
Ví dụ
$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.
Ví dụ
$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.
Ví dụ
$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ả.
Ví dụ
$collection = collect([1, 2, 3, 4]);
$filtered = $collection->filter(function ($value, $key) {
return $value > 2;
});
$filtered->all();
// [3, 4]
Ví dụ
$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.
Ví dụ
collect([1, 2, 3, 4])->first();
// 1
VD: Với có tham số truyền vào.
Ví dụ
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.
Ví dụ
$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
.
Ví dụ
$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.
Ví dụ
$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.
Ví dụ
$collection = collect(['name' => 'Desk', 'price' => 200]);
$collection->toJson();
// '{"name":"Desk", "price":200}'
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:
Ví dụ
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.
Ví dụ
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.
Ví dụ
$collection = collect(['first', 'second']);
$upper = $collection->toUpper();
// ['FIRST', 'SECOND']
VD: Macro với tham số truyền vào.
Ví dụ
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');
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:
Ví dụ
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.
Ví dụ
use Illuminate\Support\LazyCollection;
LazyCollection::make(function () {
$handle = fopen('log.txt', 'r');
while (($line = fgets($handle)) !== false) {
yield $line;
}
});
Lời kết.
Collection được sử dụng rất nhiều ở trong Laravel, thế nên các bạn cần nắm rõ một số phương thức hay dùng để đỡ phải lên search docs.