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 集合繼承了基底 Laravel 集合物件;因此,他們繼承所有基底集合類別所提供的強大的方法:
all chunk collapse contains count diff each every filter first flatten flip forget forPage get groupBy has implode intersect isEmpty keyBy keys last map merge pluck pop prepend pull push put random reduce reject reverse search shift shuffle slice sort sortBy sortByDesc splice sum take toArray toJson transform unique values where whereLoose zip
自訂集合
如果你需要使用一個自訂的 Collection
物件與你自己的擴充方法,你可以在模型中覆寫 newCollection
方法:
<?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);
}
}
一旦你定義了 newCollection
方法,在任何 Eloquent 回傳該模型的 Collection
實例的時候,你將會接收到一個你的自訂集合的實例。如果你想要在你的應用程式每個模型中使用自訂的集合,你應該在所有的模型繼承的基底模型中覆寫 newCollection
方法。