模型返回的所有多结果集都是 October\Rain\Database\Collection 对象的实例,包括通过 get 方法检索或通过关系访问的结果。Collection 对象扩展了 基础集合,因此它自然地继承了数十种方法,这些方法用于流畅地操作底层模型数组。
所有集合也可用作迭代器,使您能够遍历它们,就像它们是简单的 PHP 数组一样。
$users = User::where('is_active', true)->get();
foreach ($users as $user) {
echo $user->name;
}然而,集合比数组强大得多,并通过直观的接口提供各种 map / reduce 操作。例如,我们可以过滤所有活跃模型,并收集每个被过滤用户的名称。
$users = User::get();
$names = $users->filter(function ($user) {
return $user->is_active === true;
})
->map(function ($user) {
return $user->name;
});尽管大多数模型集合方法返回
Eloquent集合的一个新实例,但pluck、keys、zip、collapse、flatten和flip方法返回一个基础集合实例。同样地,如果map操作返回的集合不包含任何模型,它将自动转换为一个基础集合。
所有模型集合都扩展了基础集合对象;因此,它们继承了基础集合类提供的所有强大方法。
此外,October\Rain\Database\Collection 类提供了一套超集方法,以帮助管理您的模型集合。大多数方法返回 October\Rain\Database\Collection 实例;然而,一些方法返回一个基础的 Illuminate\Support\Collection 实例。
包含($键, $运算符 = 空, $值 = 空)
contains 方法可用于判断给定的模型实例是否包含在集合中。此方法接受主键或模型实例:
$users->contains(1);
$users->contains(User::find(1));差异($items)
diff 方法返回给定集合中不存在的所有模型:
use App\User;
$users = $users->diff(User::whereIn('id', [1, 2, 3])->get());除了($keys)
该 except 方法返回所有不具有给定主键的模型:
$users = $users->except([1, 2, 3]);查找($键)
find 方法会查找具有给定主键的模型。如果 $key 是一个模型实例,find 将尝试返回匹配该主键的模型。如果 $key 是一个键数组,find 将通过使用 whereIn() 返回所有与 $keys 匹配的模型:
$users = User::all();
$user = $users->find(1);刷新($附带 = [])
该 fresh 方法从数据库中获取集合中每个模型的全新实例。此外,任何指定的关联都将进行预加载:
$users = $users->fresh();
$users = $users->fresh('comments');求交集($items)
intersect 方法返回给定集合中也存在的所有模型:
use App\User;
$users = $users->intersect(User::whereIn('id', [1, 2, 3])->get());加载($relations)
load 方法为集合中的所有模型预加载给定的关联关系:
$users->load('comments', 'posts');
$users->load('comments.author');加载缺失的($relations)
该 loadMissing 方法会预加载集合中所有模型指定的关联关系,前提是这些关联关系尚未加载:
$users->loadMissing('comments', 'posts');
$users->loadMissing('comments.author');模型键()
此 modelKeys 方法返回集合中所有模型的主键:
$users->modelKeys();
// [1, 2, 3, 4, 5]使可见($属性)
此 makeVisible 方法使那些通常在集合中的每个模型上被“隐藏”的属性可见:
$users = $users->makeVisible(['address', 'phone_number']);隐藏($属性)
makeHidden 方法会隐藏集合中每个模型上通常“可见的”属性:
$users = $users->makeHidden(['address', 'phone_number']);仅限($keys)
该 only 方法返回所有具有给定主键的模型:
$users = $users->only([1, 2, 3]);unique($key = null, $strict = false)
该unique方法返回集合中所有唯一的模型。集合中,任何类型相同且主键与另一个模型相同的模型都将被移除。
$users = $users->unique();如果您需要使用自定义的 Collection 对象并搭配您自己的扩展方法,您可以在您的模型上覆盖 newCollection 方法:
class User extends Model
{
/**
* Create a new Collection instance.
*/
public function newCollection(array $models = [])
{
return new CustomCollection($models);
}
}一旦你定义了一个 newCollection 方法,每当模型返回一个 Collection 实例时,你将收到一个自定义集合的实例。如果你希望在插件或应用程序中的每个模型都使用自定义集合,你应该在你所有模型都继承的模型基类上覆盖 newCollection 方法。
use October\Rain\Database\Collection as CollectionBase;
class CustomCollection extends CollectionBase
{
}