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 集合的實例,但是
pluck
、keys
、zip
、collapse
、flatten
和flip
方法是回傳一個基底集合ˇ的實例。
可用的方法
基底集合
所有 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
{
/**
* 建立一個新的 Eloquent 集合實例。
*
* @param array $models
* @return \Illuminate\Database\Eloquent\Collection
*/
public function newCollection(array $models = [])
{
return new CustomCollection($models);
}
}
一旦你定義了 newCollection
方法,在任何 Eloquent 回傳該模型的 Collection
實例的時候,你將會接收到一個你的自訂集合的實例。如果你想要在你的應用程式每個模型中使用自訂的集合,你應該在所有的模型繼承的基底模型中覆寫 newCollection
方法。