展開文件目錄

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

{note} 雖然大多數 Eloquent 集合會回傳新的實例,不過只有 pluckkeyszipcollapseflattenflip 方法會回傳基本的集合實例。同樣的,如果 map 操作會傳一個不具有任何 Eloquent 模型的集合,它會自動轉換成基本的集合。

可用的方法

基本的集合

所有 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 方法。