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 集合会返回新的「Eloquent 集合」实例,但是
pluck
,keys
,zip
,collapse
,flatten
和flip
方法会返回 基础集合 实例。相应的,如果一个
map
操作返回一个不包含任何 Eloquent 模型的集合,那么它将会自动转换成基础集合。
可用的方法
集合对象
所有 Eloquent 集合都继承了基础的 Laravel 集合 对象。因此,他们也继承了所有集合类提供的强大的方法:
[all](/docs//collections#method-all)
[avg](/docs//collections#method-avg)
[chunk](/docs//collections#method-chunk)
[collapse](/docs//collections#method-collapse)
[combine](/docs//collections#method-combine)
[contains](/docs//collections#method-contains)
[count](/docs//collections#method-count)
[diff](/docs//collections#method-diff)
[diffKeys](/docs//collections#method-diffkeys)
[each](/docs//collections#method-each)
[every](/docs//collections#method-every)
[except](/docs//collections#method-except)
[filter](/docs//collections#method-filter)
[first](/docs//collections#method-first)
[flatMap](/docs//collections#method-flatmap)
[flatten](/docs//collections#method-flatten)
[flip](/docs//collections#method-flip)
[forget](/docs//collections#method-forget)
[forPage](/docs//collections#method-forpage)
[get](/docs//collections#method-get)
[groupBy](/docs//collections#method-groupby)
[has](/docs//collections#method-has)
[implode](/docs//collections#method-implode)
[intersect](/docs//collections#method-intersect)
[isEmpty](/docs//collections#method-isempty)
[keyBy](/docs//collections#method-keyby)
[keys](/docs//collections#method-keys)
[last](/docs//collections#method-last)
[map](/docs//collections#method-map)
[max](/docs//collections#method-max)
[merge](/docs//collections#method-merge)
[min](/docs//collections#method-min)
[only](/docs//collections#method-only)
[pluck](/docs//collections#method-pluck)
[pop](/docs//collections#method-pop)
[prepend](/docs//collections#method-prepend)
[pull](/docs//collections#method-pull)
[push](/docs//collections#method-push)
[put](/docs//collections#method-put)
[random](/docs//collections#method-random)
[reduce](/docs//collections#method-reduce)
[reject](/docs//collections#method-reject)
[reverse](/docs//collections#method-reverse)
[search](/docs//collections#method-search)
[shift](/docs//collections#method-shift)
[shuffle](/docs//collections#method-shuffle)
[slice](/docs//collections#method-slice)
[sort](/docs//collections#method-sort)
[sortBy](/docs//collections#method-sortby)
[sortByDesc](/docs//collections#method-sortbydesc)
[splice](/docs//collections#method-splice)
[sum](/docs//collections#method-sum)
[take](/docs//collections#method-take)
[toArray](/docs//collections#method-toarray)
[toJson](/docs//collections#method-tojson)
[transform](/docs//collections#method-transform)
[union](/docs//collections#method-union)
[unique](/docs//collections#method-unique)
[values](/docs//collections#method-values)
[where](/docs//collections#method-where)
[whereStrict](/docs//collections#method-wherestrict)
[whereIn](/docs//collections#method-wherein)
[whereInLoose](/docs//collections#method-whereinloose)
[zip](/docs//collections#method-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
方法。
译者署名
用户名 | 头像 | 职能 | 签名 | |
---|---|---|---|---|
@skyverd | ![]() |
翻译 | 全桟工程师,时光博客 | atabase\Eloquent\Model; |
class User extends Model
{
/**
* 创建一个新的 Eloquent 集合实例对象。
*
* @param array $models
* @return \Illuminate\Database\Eloquent\Collection
*/
public function newCollection(array $models = [])
{
return new CustomCollection($models);
}
}