Laravel Spatie Permissions - user and role relation get only id and name

Viewed 1973

I'm using Laravel Spatie Permissions to manage roles and permissions in my app. I'm traing to retrieve only Role id and name in the relation between users and roles. My UserResource looks like this:

class UserResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id'        => $this->id,
            'name'      => $this->name,
            'surname'   => $this->surname,
            'email'     => $this->email,
            'inactive'  => $this->inactive,
            'roles'     => $this->roles
        ];
    }
}

And the json looks like this:

"data": [
        {
            "id": 1,
            "name": "Admin",
            "surname": "Sudo",
            "email": "admin@sudo.com",
            "inactive": 0,
            "roles": [
                {
                    "id": 1,
                    "name": "Admin",
                    "guard_name": "web",
                    "created_at": "2020-05-28 23:18:58",
                    "updated_at": "2020-05-28 23:18:58",
                    "pivot": {
                        "model_id": 1,
                        "role_id": 1,
                        "model_type": "App\\User"
                    }
                }
            ]
        },
]

What I really need it's a json like this:

"data": [
        {
            "id": 1,
            "name": "Admin",
            "surname": "Sudo",
            "email": "admin@sudo.com",
            "inactive": 0,
            "roles": [
                {
                    "id": 1,
                    "name": "Admin",
                },
                {
                    "id": 2,
                    "name": "Default",
                },
                {
                    "id": 3,
                    "name": "Guest",
                }
            ]
        },
]

I really don't know how to modified my models relations or the parameter $this->roles (in UserResources) to could get this json.

2 Answers

The easiest solution was using a map function:

'roles'     => $this->roles->map(function($role){
            return [
                'id' => $role['id'],
                'name' => $role['name']
            ];
        })

You can create a RoleResource:

class RoleResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
        ];
    }
}

And use it on your UserResource:

class UserResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id'        => $this->id,
            'name'      => $this->name,
            'surname'   => $this->surname,
            'email'     => $this->email,
            'inactive'  => $this->inactive,
            'roles'     => RoleResource::collection($this->roles),
        ];
    }
}
Related