If you are using your results in JSON format, this should be very easy if you implement Eloquent Resources
Define three resources as follows:
(Note: to easily define a resource like below, do:
php artisan make:resource UserRes
Then modify the toArray function as you desire.
)
UserRes
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class UserRes extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$user = parent::toArray($request);
$user["roles"] = RolesRes::collection($this->roles);
return $user;
}
}
RolesRes
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class RolesRes extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$res = parent::toArray($request);
$res["permissions"] = $this->permissions;
return $res;
}
}
PermissionsRes:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class PermissionsRes extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$perm = parent::toArray($request);
return $perm;
}
}
In my app, here is a screenshot of a sample of results when fetching a single user. Take note of the nesting of multiple roles under which are multiple permissions.
Screenshot of a JSON response when querying a single user