Info: Bài viết được lấy từ nguồn https://github.com/petehouston/laravel-docs-vn

Eloquent: Collections

Giới thiệu

Tất cả các tập hợp nhiều kết quả bởi Eloquent đều là một instance từ Illuminate\Database\Eloquent\Collection, bao gồm kết quả lấy từ hàm get hay thông qua relationship. Các Eloquent collection object kế thừa từ Laravel base collection, nên chúng đề kế thừa các hàm để làm xử lý với lớp dưới của Eloquent model.

Tất nhiên là các collections đều có thể sử dụng như iterators, cho phép bạn thực hiện lặp như với một mảng PHP:

$users = App\User::where('active', 1)->get();

foreach ($users as $user) {
    echo $user->name;
}

Tuy nhiên, collection còn mạnh hơn array nhiều và cung cấp thêm một số các xử lý map / reduce mà có thể móc nối được qua một interface dễ hiểu. Ví dụ, cùng nhau xoá các model inactive và thu thập tên của các user còn lại:

$users = App\User::where('active', 1)->get();

$names = $users->reject(function ($user) {
    return $user->active === false;
})
->map(function ($user) {
    return $user->name;
});

Chú ý: Trong khi hầu hết hàm Eloquent collection trả về một instance mới của một Eloquent collection, các hàm pluck, keys, zip, collapse, flattenflip trả về một instance của base collection.

Danh sách các hàm

Base Collection

Tất cả các Eloquent collections đều kế thừa từ Laravel collection, vì thế mà chúng kế thừa tất cả các hàm mạnh mẽ được cung cấp bởi lớp base collection:

Tạo collection riêng

Nếu bạn muốn tạo một object Collection riêng với hàm mở rộng riêng, bạn có thể ghi đè hàm newCollection trong model:

<?php

namespace App;

use App\CustomCollection;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Create a new Eloquent Collection instance.
     *
     * @param  array  $models
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function newCollection(array $models = [])
    {
        return new CustomCollection($models);
    }
}

Khi bạn đã khai báo một hàm newCollection, bạn sẽ nhận được một instance của collection đó bất cứ khi nào Eloquent trả về một Collection của model. Nếu bạn muốn sử dụng collection riêng cho tất cả các model trong ứng dụng, bạn nên ghi đè vào hàm newCollection trong class base của model, mà được kế thừa từ tất cả các model khác.