集合

2018-02-24 15:52 更新

所有 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);
    }
}
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号