【问题标题】:Laravel Spatie Permissions - user and role relation get only id and nameLaravel Spatie 权限 - 用户和角色关系仅获取 id 和 name
【发布时间】:2020-09-17 17:23:32
【问题描述】:

我正在使用 Laravel Spatie 权限来管理我的应用中的角色和权限。我被训练在用户和角色之间的关系中只检索角色 ID 和名称。我的 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'     => $this->roles
        ];
    }
}

json 看起来像这样:

"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"
                    }
                }
            ]
        },
]

我真正需要的是这样的 json:

"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",
                }
            ]
        },
]

我真的不知道如何修改我的模型关系或参数 $this->roles(在 UserResources 中)以获得这个 json。

【问题讨论】:

  • 请分享加载用户角色的代码

标签: laravel laravel-6.2 laravel-permission


【解决方案1】:

最简单的解决方案是使用地图功能:

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

【讨论】:

  • 干得好。 @Guido_Caffa
【解决方案2】:

您可以创建 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,
        ];
    }
}

并在您的 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),
        ];
    }
}

【讨论】:

  • 是的,问题是我有一个资源用于我的角色,它用于角色 ABM,它与用户和权限模型有关系。一个模型有两个资源是一种很好的做法吗?
  • 啊,好的。在这种情况下,您可以将此资源命名为 RoleMinResource 例如,以将其与其他资源区分开来,并且您将知道说 Min 的资源是仅返回 id 和名称(最小数据)的资源。这是一个不错的做法,您可以为每种情况使用不同的资源,例如在列表中显示的数据通常比返回模型详细信息时少。
  • 感谢您的回复。我已经用地图功能找到了它
猜你喜欢
  • 2021-05-29
  • 1970-01-01
  • 2020-11-01
  • 2019-08-06
  • 2021-01-05
  • 2020-03-31
  • 2021-04-09
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多