过滤后无法将集合作为数组返回

时间:2019-12-14 18:40:45

标签: laravel

我当前在laravel中遇到问题,其中Illuminate \ Database \ Eloquent \ Collection始终作为对象而不是作为数组返回—导致vue组件出现问题。

Route::get('/users', function (Request $request) {

    $users = User::all();

    $filtered = $users->filter( function ($user) {

            if($user->can('viewAny', 'App\Module')){
                return true;
            }
    });

    return $filtered;

}

通过过滤器的所有内容都会拒绝隐式或显式转换为数组:

return User::all(); //Returns Array

return $filtered; //Returns object
return $filtered->toArray(); //Returns object?!

我在这里做错了什么? Laravel版本是5.8,$ filtered中的典型User对象如下:

3: {
id: 4,
first_name: "Alexandrea",
last_name: "Lind",
email: "russel.oda@example.net",
email_verified_at: "2019-09-25 20:35:03",
created_at: "2019-09-25 20:35:03",
updated_at: "2019-09-25 20:35:03",
is_admin: false,
cycle: 2019,
widening_access_pricing: 0,
can_comment: 1,
can_comment_without_approval: 0,
email_consent: "2019-09-25 20:35:03",
affiliate_id: null,
purchases: [
  {
  id: 28,
  payment_intent_id: "pi_1FoAWUAsJiXFAGV72unvUP6a",
  status: "succeeded",
  user_id: 4,
  product: null,
  module_id: 6,
  created_at: "2019-12-10 15:21:14",
  updated_at: "2019-12-10 15:21:16"
  }
],
completion_records: [
]
},

2 个答案:

答案 0 :(得分:2)

如果您不需要以记录的“ id”作为键的数据,则可以在集合上调用values来重置键:

return $filtered->values();

JSON无法将关联数组表示为数组,它必须将其表示为对象。索引为零的数组可以表示为JSON中的数组,因为其键是连续的,因此无需以任何特殊方式表示。

Laravel 6.x Docs - Collections - Available Methods - values

答案 1 :(得分:0)

我最近遇到了类似的问题,您只需要在过滤集合后调用all()方法,这就是laravel文档中集合过滤器的代码段。

$collection = collect([1, 2, 3, 4]);

$filtered = $collection->filter(function ($value, $key) {
    return $value > 2;
});

$filtered->values();