Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

ahoi's avatar
Level 5

GroupBy and mapToGroups returns object in API resource

Hello everybody,

I am creating an API resource:

public function toArray($request)
    {
        return [
            'permissions' => Permission::all()       
         ];
    }

This is the result Permission::all() in my browser's console:

{
  "data": {
    "permissions": [
      {
        "id": 1,
        "name": "index users",
        "guard_name": "web",
        "created_at": "2019-06-11 06:45:52",
        "updated_at": "2019-06-11 06:45:52"
      },
      {
        "id": 2,
        "name": "create users",
        "guard_name": "web",
        "created_at": "2019-06-11 06:45:52",
        "updated_at": "2019-06-11 06:45:52"
      },
      {
        "id": 3,
        "name": "view users",
        "guard_name": "web",
        "created_at": "2019-06-11 06:45:52",
        "updated_at": "2019-06-11 06:45:52"
      },
      {
        "id": 4,
        "name": "update users",
        "guard_name": "web",
        "created_at": "2019-06-11 06:45:52",
        "updated_at": "2019-06-11 06:45:52"
      },
      {
        "id": 5,
        "name": "delete users",
        "guard_name": "web",
        "created_at": "2019-06-11 06:45:52",
        "updated_at": "2019-06-11 06:45:52"
      },
      {
        "id": 21,
        "name": "index settings",
        "guard_name": "web",
        "created_at": "2019-06-11 06:45:52",
        "updated_at": "2019-06-11 06:45:52"
      },
      {
        "id": 22,
        "name": "view settings",
        "guard_name": "web",
        "created_at": "2019-06-11 06:45:52",
        "updated_at": "2019-06-11 06:45:52"
      },
      {
        "id": 23,
        "name": "update settings",
        "guard_name": "web",
        "created_at": "2019-06-11 06:45:52",
        "updated_at": "2019-06-11 06:45:52"
      }
    ]
  }
}

I would like to an array like this:

[
{ 'group': 'users', 'view': true, 'edit': false, 'create': true, 'delete':
true },
{ 'group': 'settings', 'view': true, 'edit': false, 'create': true, 'delete':
true },
]

This is what I got so far:

Permission::all()->mapToGroups(function
            ($item){
                $exploded = explode(' ', $item->name);
                $item->group = $exploded[1];
                $item->verb = $exploded[0];
                $item->can = [$item->verb => true];

                return [$item['group'] => $item['can']];
            })->map(function($group){
                $permission = $group->collapse();
                return $permission;
            })

This is the result in my browser's console:

{
    "data": {
        "permissions": {
            "users": {
                "index": true,
                "create": true,
                "view": true,
                "update": true,
                "delete": true
            },
            "settings": {
                "index": true,
                "view": true,
                "update": true
            }
        }
    }
}

These are my questions:

  • As you can see, the result is an object, not an array. How can I change it to an array?
  • How can I remove the key ('settings', 'user', ...) and move them to the single array like in my example?
0 likes
2 replies
bobbybouwmann's avatar

It's an object because $item is an object I guess.

What happens when you do json_decode($data), do you get arrays than?

bobbybouwmann's avatar
Level 88

I think you can get around it by doing something like this

$data = Permission::all()->mapToGroups(function ($permission) { 
    $exploded = explode(' ', $permission->name); 

    return [$exploded[1] => [$exploded[0] => true]]; 
});

At least I got this back when running tinker

{"users":[{"index":true},{"create":true},{"view":true},{"update":true},{"delete":true}],"settings":[{"index":true},{"view":true},{"update":true}]}"

Looks like an array to me ;)

1 like

Please or to participate in this conversation.