集合

最后更新于: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); } } ~~~
';