Reputation: 1251
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": "[email protected]",
"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": "[email protected]",
"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.
Upvotes: 3
Views: 3274
Reputation: 1251
The easiest solution was using a map function:
'roles' => $this->roles->map(function($role){
return [
'id' => $role['id'],
'name' => $role['name']
];
})
Upvotes: 4
Reputation: 5098
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),
];
}
}
Upvotes: 2