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 集合會回傳新的實例,不過只有
pluck
、keys
、zip
、collapse
、flatten
和flip
方法會回傳基本的集合實例。同樣的,如果map
操作會傳一個不具有任何 Eloquent 模型的集合,它會自動轉換成基本的集合。
可用的方法
基本的集合
所有 Eloquent 集合都繼承了基本的 Laravel 集合物件。因此,它們繼承了基本集合類別提供的所有強大方法:
all average avg chunk collapse combine concat contains containsStrict count crossJoin dd diff diffKeys dump each eachSpread every except filter first flatMap flatten flip forget forPage get groupBy has implode intersect isEmpty isNotEmpty keyBy keys last map mapInto mapSpread mapToGroups mapWithKeys max median merge min mode nth only pad partition pipe pluck pop prepend pull push put random reduce reject reverse search shift shuffle slice sort sortBy sortByDesc splice split sum take tap toArray toJson transform union unique uniqueStrict unless values when where whereStrict whereIn whereInStrict whereNotIn whereNotInStrict 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
方法。