如何仅获取 Laravel 集合中的嵌套数据

How to get only nested data in Laravel collection

我写了这样一个数据库选择(Laravel 8):

$users = collect(User::with(['roles','roles.permissions'])->find(21));

结果如下

=> Illuminate\Support\Collection {#2051
     all: [
       "id" => 21,
       "first_name" => "test",
       "name" => "test",
       "..." => "...",
       "roles" => [
         [
           "id" => 9,
           "name" => "Test",
           "permissions" => [
             [
               "id" => 13,
               "name" => "userReadList",
             ],
             [
               "id" => 11,
               "name" => "userUpdate",
             ],
           ],
         ],
         [
           "id" => 4,
           "name" => "responsible",
           "permissions" => [
             [
               "id" => 10,
               "name" => "userRead",
             ],
             [
               "id" => 9,
               "name" => "userCreate",
             ],
           ],
         ],
       ],
     ],
   }

现在:我必须在查询中进行更改以仅获取一个包含权限 ID 的数组,如下所示:[13,11,10,9]?

或者是我的查询主体获取权限 id 错误

我找到了解决方案:

$userPermissions = collect(User::with(['roles','roles.permissions'])->find(21));

Arr::flatten(Arr::pluck($userPermissions['roles'] , 'permissions.*.id'));

//[13,11,1,4,]

但我认为,更好的方法是下面的

$userPermissions = User::with(['roles','roles.permissions'])->find(21);

$userPermissions->roles->pluck('permissions.*.id')->flatten()->toArray();

//[13,11,1,4,]

也可以采用以下方法

$userPermissions = User::with(['roles','roles.permissions'])->where('id',21)->get();

$userPermissions->pluck('roles.*.permissions.*.id')->flatten()->toArray();

//[13,11,1,4,]