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

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 base collection instance. Tương tự, nếu một map trả về một collection không chứa bất kỳ Eloquent models nào, nó sẽ tự động biến thành một collection cơ bản.

Các phương thức tồn tại

Collection cơ bản

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ùy biến Collections

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.

Nguồn: https://laravel.com/docs/5.3/eloquent-collections