集合
最后更新于:2022-04-01 15:12:12
所有 Eloquent 查询返回的数据,如果结果多于一条,不管是经由 get 方法或是 relationship,都会转换成集合对象返回。这个对象实现了 IteratorAggregate PHP 接口,所以可以像数组一般进行遍历。而集合对象本身还拥有很多有用的方法可以操作模型数据。
确认集合中里是否包含特定键值
例如,我们可以使用 contains 方法,确认结果数据中,是否包含主键为特定值的对象。
~~~
$roles = User::find(1)->roles;
if ($roles->contains(2))
{
//
}
~~~
集合也可以转换成数组或 JSON:
~~~
$roles = User::find(1)->roles->toArray();
$roles = User::find(1)->roles->toJson();
~~~
如果集合被转换成字符串类型,会返回 JSON 格式:
~~~
$roles = (string) User::find(1)->roles;
~~~
## 集合遍历
Eloquent 集合里包含了一些有用的方法可以进行循环或是进行过滤:
~~~
$roles = $user->roles->each(function($role)
{
//
});
~~~
## 集合过滤
过滤集合时,回调函数的使用方式和 array_filter 里一样。
~~~
$users = $users->filter(function($user)
{
return $user->isAdmin();
});
~~~
> 注意: 如果要在过滤集合之后转成 JSON,转换之前先调用 values 方法重设数组的键值。
遍历传入集合里的每个对象到回调函数
~~~
$roles = User::find(1)->roles;
$roles->each(function($role)
{
//
});
~~~
## 依照属性值排序
~~~
$roles = $roles->sortBy(function($role)
{
return $role->created_at;
});
~~~
## 依照属性值排序
~~~
$roles = $roles->sortBy('created_at');
~~~
## 返回自定义的集合对象
有时您可能想要返回自定义的集合对象,让您可以在集合类里加入想要的方法。可以在 Eloquent 模型类里重写 newCollection 方法:
~~~
class User extends Model {
public function newCollection(array $models = [])
{
return new CustomCollection($models);
}
}
~~~