Eloquent:集合

簡介

由 Eloquent 回傳的所有多種結果的集合都是 Illuminate\Database\Eloquent\Collection 物件的實例,包含經由 get 方法取得或是經由關聯來存取的結果。Eloquent 集合物件繼承了 Laravel 基底集合,所以它自然繼承了許多可用於流暢地與 Eloquent 模型的底層陣列合作的方法。

當然,所有的集合也都可以作為迭代器,讓你像是操作簡單的 PHP 陣列一般去遍歷集合:

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

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

然而,集合比陣列更強大並提供 map 或 reduce 等各種鏈結操作的直觀介面。例如,讓我們來移除所有未啟用的模型並收集其餘每個使用者的名字:

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

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

注意: 雖然大多數 Eloquent 集合方法回傳一個新的 Eloquent 集合的實例,但是 pluckkeyszipcollapseflattenflip 方法是回傳一個基底集合ˇ的實例。

可用的方法

基底集合

所有 Eloquent 集合繼承了基底 Laravel 集合物件;因此,他們繼承了所有基底集合類別所提供的強大的方法:

自訂集合

如果你需要使用一個自訂的 Collection 物件與你自己的擴充方法,你可以在模型中覆寫 newCollection 方法:

<?php

namespace App;

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

class User extends Model
{
    /**
     * 建立一個新的 Eloquent 集合實例。
     *
     * @param  array  $models
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function newCollection(array $models = [])
    {
        return new CustomCollection($models);
    }
}

一旦你定義了 newCollection 方法,在任何 Eloquent 回傳該模型的 Collection 實例的時候,你將會接收到一個你的自訂集合的實例。如果你想要在你的應用程式每個模型中使用自訂的集合,你應該在所有的模型繼承的基底模型中覆寫 newCollection 方法。