Collections Trong Laravel Là Gì?

Collections Trong Laravel Là Gì?
Collection thường được sử dụng rất phổ biến. Do đó, các bạn lập trình viên nên tìm hiểu và nắm rõ các phương thức thường dùng để đỡ mất thời gian search docs.

Các bạn đã tìm hiểu qua về relationship trong Laravel. Nhờ có relationship, chúng ta có thể xử lý các mối quan hệ của bảng trong database để tiết kiệm thời gian làm việc. Tuy là có tiện lợi, nhưng liệu có cách nào để lọc và xử lý dữ liệu nhanh gọn? Laravel có hỗ trợ người dùng chúng ta bộ thư viện (collections). Nhờ có collections, chúng ta có thể thực hiện 2 điều trên nhanh chóng và hiệu quả. 

 

Collections trong Laravel là gì?

 

Collections trong Laravel thường là một class đã có tích hợp các phương thức xử lý dữ liệu thường xuyên để giảm thiểu thời gian thực hiện cho các bạn lập trình. Khi phải kết nối với database vì dữ liệu trả về từ nguồn database có sẵn (thường là collection), thì Laravel có hỗ trợ tính năng lọc và xử lý dữ liệu thông qua collection. 

 

Hướng dẫn khai báo và sử dụng collections 

 

Để có thể khai báo và sử dụng collections, các bạn cần phải gọi namespace của nó.

 

use Illuminate\Support\Collection;

 

Sau khi đã gọi namespace thành công, các bạn nên bắt đầu khởi tạo collections. Thông thường, chúng ta có 2 cách.

 

Sử dụng helper collect

 

Bạn có thể sử dụng helper collect để tạo ra bộ collection. Ví dụ:

 

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

 

Sử dụng new Collection()

 

Bạn có thể sử dụng new Collection() trong Laravel để khởi tạo luôn object từ class collection. Ví dụ: 

 

use Illuminate\Support\Collection;
$collection = new Collection([1, 2, 3]);

 

Ngoài ra, bạn cũng có thể thử thêm cách thứ 3.

 

Sử dụng Collection::make()

 

Bạn đã biết đến cách này chưa? Nếu chưa, thì bạn nên thử khởi tạo object thông qua sử dụng static method trong collection. Ví dụ:

 

use Illuminate\Support\Collection;
$collection = Collection::make([1, 2, 3]);

 

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

 

Tổng hợp các phương thức collections phổ biến và nên sử dụng 

 

Các bạn nên tận dụng tất cả phương thức collections vì Laravel hỗ trợ rất nhiều. Có khoảng gần 150 phương thức để chúng ta xử lý toàn bộ mảng dữ liệu bên trong. Do thời gian có giới hạn, chúng ta chỉ nên tập trung tìm hiểu một số phương thức phổ biến nhất. 

 

all 

 

Phương thức all có chức năng là sẽ trả về tất cả phần tử đang hiện hữu trong collections. 

 

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

 

avg() hoặc average()

 

Phương thức avg() hoặc average() trả về giá trị trung bình của các phần tử hiện có trong mảng theo key. Ví dụ:

 

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

 

chunk()

 

Phương thức chunk() sẽ cắt các giá trị nằm ở bên trong collection thành các mảng con (theo kích thước quy định). 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 collapse() sẽ làm phẳng các mảng con bên trong collection và tạo thành một mảng duy nhất. 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 collect() sẽ trả về 1 collection mới cùng với các giá trị có trong collection hiện tại. Ví dụ: 

 

$collectionA = collect([1, 2, 3]);
$collectionB = $collectionA->collect();
$collectionB->all();
// [1, 2, 3]

 

concat()

 

Phương thức concat() sẽ nối các giá trị vào cuối của mảng trong collection. Ví dụ:

 

$collection = collect(['Hien Ho']);
$concatenated = $collection->concat(['Tai Dao'])->concat(['name' => 'Hien Tai']);
$concatenated->all();
// ['Hien Ho', 'Tai Dao', 'Hien Ho']

 

contains()

 

Phương thức contains() có nhiệm vụ kiểm tra xem một value nào đó có tồn tại trong collection hay không. Ví dụ:

 

$collection = collect(['name' => 'Desk', 'price' => 100]);
$collection->contains('Desk');
// true
$collection->contains('New York');
// false
$collection = collect([
    ['product' => 'Desk', 'price' => 200],
    ['product' => 'Chair', 'price' => 100],
]);
$collection->contains('product', 'Bookcase');
// false
$collection = collect([1, 2, 3, 4, 5]);
$collection->contains(function ($value, $key) {
    return $value > 5;
});
// false

 

count()

 

Phương thức count()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 dd() sẽ dump ra các giá trị đang có trong mảng. 

 

diff()

 

Phương thức diff() 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 each()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 filter() có nhiệm vụ lặp qua các phần tử có trong collection và thực thi logic trong closure. Nếu closure trả về false thì phần tử đó 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]
$collection = collect([1, 2, 3, null, false, '', 0, []]);
$collection->filter()->all();
// [1, 2, 3]

 

first()

 

Phương thức first() sẽ trả về giá trị đầu tiên pass với điều kiện có trong closure. Ví dụ: 

 

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

 

flip()

 

Phương thức flip()sẽ đảo ngược các giá trị key và array trong mảng. Ví dụ:

 

$collection = collect(['name' => 'ngoc', 'framework' => 'laravel']);
$flipped = $collection->flip();
$flipped->all();
// ['ngoc' => 'name', 'laravel' => 'framework']

 

get()

 

Phương thức get() 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, thì nó sẽ trả về null. Ví dụ: 

 

$collection = collect(['name' => 'hien', 'framework' => 'laravel']);
$value = $collection->get('name');
// hien

 

sum()

 

Phương thức sum() sẽ trả về tổng các giá trị của các phần tử có trong collection. Các bạn có thể sử dụng phương thức sum() tương tự như với phương thức avg().

 

min()

 

Phương thức min() 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 max() sẽ trả về giá trị lớn nhất của các phần tử trong collection. Các bạn có thể sử dụng tương tự như ở phương thức avg().

 

merge()

 

Phương thức merge() có nhiệm vụ gộp mảng đã cho vào trong collection. Bất cứ string key trong mảng trùng với string key trong collection sẽ bị ghi chồng lên vì giá trị của collection. Ví dụ:

 

$collection = collect(['product_id' => 1, 'name' => 'Desk']);
$merged = $collection->merge(['price' => 100, 'discount' => false]);
$merged->all();
// ['product_id' => 1, 'name' => 'Desk', 'price' => 100, 'discount' => false]

 

toArray()

 

Phương thức toArray() 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 toJson() sẽ convert collection về dạng JSON string. Ví dụ:

 

$collection = collect(['name' => 'Desk', 'price' => 200]);
$collection->toJson();
// '{"name":"Desk", "price":200}'

pluck()

 

Phương thức pluck lấy toàn bộ các giá trị của collection cho một key cho trước. Ví dụ:

 

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

 

Kế thừa collection là gì?

 

Collection trong Laravel hỗ trợ các bạn khá nhiều phương thức. Nếu bạn cần bổ sung thêm các phương thức mới cho collection, Laravel cũng có hỗ trợ. Bạn có thể dùng phương thức macro để tạo thêm phương thức. Khi đó, cú pháp của nó sẽ như sau: 

 

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

 

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

 

Hãy xem ví dụ tạo mới phương thức toUpper cho collection.

 

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

 

Ở 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']

 

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');

 

LazyCollection là gì?

 

Collection trong Laravel là đã tương đối mạnh mẽ. Nếu bạn muốn kết hợp sử dụng collection với dữ liệu lớn, thì bạn nên dùng thêm LazyCollection. Đây là class được tạo nên từ PHP generator nên nó sử dụng ít tài nguyên. Để tạo LazyCollection, các bạn sử dụng cú pháp như sau:

 

LazyCollection::make();

 

Các bạn có thể sử dụng các phương thức cho LazyCollection tương tự Collection. Ví dụ:

 

use Illuminate\Support\LazyCollection;
LazyCollection::make(function () {
    $handle = fopen('log.txt', 'r');
    while (($line = fgets($handle)) !== false) {
        yield $line;
    }
});

 

Hồ Hữu Hiền

Mình là developer nên đôi khi viết bài không hay lắm mong các bạn thông cảm. Nếu muốn biết thêm thông tin về mình thì vui lòng vào website này để biết. https://huuhienqt.dev/

Bình luận (0)