模型返回的所有多结果集都是 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 实例.
包含($key, $operator = null, $value = null)
The contains 方法可用于确定给定的模型实例是否被集合包含。此方法接受主键或模型实例:
$users->contains(1);
$users->contains(User::find(1));计算差异($项目)
diff 方法返回所有不存在于给定集合中的模型:
use App\User;
$users = $users->diff(User::whereIn('id', [1, 2, 3])->get());排除($keys)
except 方法返回所有不具有给定主键的模型:
$users = $users->except([1, 2, 3]);查找($key)
find 方法查找具有给定主键的模型。如果 $key 是模型实例,find 将尝试返回一个匹配该主键的模型。如果 $key 是一个键数组,find 将返回所有匹配 $keys 的模型,并使用 whereIn():
$users = User::all();
$user = $users->find(1);刷新($with = [])
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']);隐藏($attributes)
该 makeHidden 方法隐藏了集合中每个模型上通常“可见”的属性:
$users = $users->makeHidden(['address', 'phone_number']);仅($keys)
only 方法返回所有具有给定主键的模型:
$users = $users->only([1, 2, 3]);唯一($键 = 空, $严格 = 假)
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
{
}