eloquent 集合——迹忆客-ag捕鱼王app官网
简介
eloquent 返回的包含多条记录的结果集都是 illuminate\database\eloquent\collection
对象的实例,包括通过 get 方法或者通过访问关联关系获取的结果。eloquent 集合对象继承自 laravel 的集合基类,因此很自然的继承了很多处理 eloquent 模型底层数组的方法。
当然,集合也是迭代器,允许你像 php 数组一样对其进行循环:
$users = app\user::where('active', 1)->get();
foreach ($users as $user) {
echo $user->name;
}
然而,集合使用直观的接口提供了各种映射/简化操作,因此比数组更加强大。例如,我们可以通过以下方式移除所有无效的模型并聚合剩下用户的姓名:
$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
方法返回的是集合基类实例。类似地,如果 map 操作返回的集合不包含任何 eloquent 模型,将会被自动转化成集合基类。
可用方法
所有的 eloquent 集合继承自 laravel 集合对象基类,因此,它们继承所有集合基类提供的强大方法,可以查看laravel 集合获取更多方法。
此外,illuminate\database\eloquent\collection
类还提供了一些方法超集以便帮助我们管理模型集合。这些方法大多返回 illuminate\database\eloquent\collection
实例,不过,有些也会返回 illuminate\support\collection
实例:
- contains
- diff
- except
- find
- fresh
- intersect
- load
- loadmissing
- modelkeys
- makevisible
- makehidden
- only
- toquery
- unique
contains
contains($key, $operator = null, $value = null)
contains
方法可用于判断给定模型实例是否包含在集合中,该方法接收主键 id 或模型实例作为参数:
$users->contains(1);
$users->contains(user::find(1));
diff
diff($items)
diff
方法返回给定集合中所有不存在的模型:
use app\user;
$users = $users->diff(user::wherein('id', [1, 2, 3])->get());
except
except($keys)
except
方法返回所有不包含给定主键的模型:
$users = $users->except([1, 2, 3]);
find
find($key)
find
方法会查找包含给定主键的模型。如果 $key 是一个模型实例,则 find 会尝试返回与该主键相匹配的模型;如果 $key 是一个主键数组,find 将会使用 wherein() 返回与 keys 匹配的所有模型:
$users = user::all();
$user = $users->find(1);
findmany
findmany($arr)
findmany
方法通过传入主键数组返回所有模型:
$users = user::all();
$user = $users->findmany([1, 2, 3]);
fresh
fresh($with = [])
fresh
方法会从数据库中获取集合中每个模型的新实例,此外,任何指定的关联关系都会被渴求式加载:
$users = $users->fresh();
$users = $users->fresh('comments');
intersect
intersect($items)
intersect
方法返回所有同时存在于给定集合的模型:
use app\user;
$users = $users->intersect(user::wherein('id', [1, 2, 3])->get());
load
load($relations)
load
方法会饥渴式加载集合中所有模型的给定关联关系:
$users->load('comments', 'posts');
$users->load('comments.author');
loadmissing
loadmissing($relations)
loadmissing
方法会饥渴式加载集合中所有模型的给定关联关系,如果这个关联关系还没有被加载的话:
$users->loadmissing('comments', 'posts');
$users->loadmissing('comments.author');
modelkeys
modelkeys()
modelkeys
方法会返回集合中所有模型的主键:
$users->modelkeys();
// [1, 2, 3, 4, 5]
makevisible
makevisible($attributes)
makevisible
方法会让集合中每个模型的“hidden”属性变成可见:
$users = $users->makevisible(['address', 'phone_number']);
makehidden
makehidden($attributes)
makehidden
方法会让集合中每个模型的“visible”属性隐藏起来:
$users = $users->makehidden(['address', 'phone_number']);
only
only($keys)
only
方法会返回包含给定主键的所有模型:
$users = $users->only([1, 2, 3]);
unique
unique($key = null, $strict = false)
unique
方法会返回集合中的所有唯一模型,即剔除重复模型,任何类型相同主键相同的重复模型都会被移除:
$users = $users->unique();
自定义集合
如果我们需要在自己扩展的方法中使用自定义的集合对象,可以重写模型上的 newcollection 方法:
定义好 newcollection
方法后,无论何时 eloquent 返回该模型的 collection 实例你都会获取到自定义的集合。如果你想要在应用中的每一个模型中使用自定义集合,需要在模型基类中重写 newcollection
方法。
查看笔记