2

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.

Guido Caffa
  • 901
  • 1
  • 7
  • 17

2 Answers2

3

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),
        ];
    }
}
porloscerros Ψ
  • 3,618
  • 2
  • 8
  • 16
  • Yes, the problem with this is that i have a resource for my Roles, it's used for roles ABM and it have relations with users and permissions models. It's a good practice having two resources for one model? – Guido Caffa May 30 '20 at 13:33
  • Ahh, ok. In that case you can name this resource as `RoleMinResource` for example, to differentiate it from the other one, and you will know that the one that says Min is the one that only returns the id and the name (the minimum data). It is not bad practice, you can have different resources for each case, for example in the lists you generally show less data than when you return a detail of a model. – porloscerros Ψ May 30 '20 at 13:39
  • 1
    Thanks you for your response. I have reached it out with a map function – Guido Caffa May 30 '20 at 14:02
3

The easiest solution was using a map function:

'roles'     => $this->roles->map(function($role){
            return [
                'id' => $role['id'],
                'name' => $role['name']
            ];
        })
Guido Caffa
  • 901
  • 1
  • 7
  • 17