【问题标题】:Laravel Eloquent - pluck() role nameLaravel Eloquent - pluck() 角色名称
【发布时间】:2020-10-27 19:55:02
【问题描述】:

我正在尝试从具有角色的请求中获取经过身份验证的用户对象。我正在使用Spatie laravel-permissions 和 Laravel 8。

像这样从请求中获取用户对象

$request->user()->getRoleNames()->pluck('name');
return $request->user();

返回

{
   "id":1,
   "name":"User name",
   "email":"User email",
   "email_verified_at":null,
   "company":"--",
   "phone":"--",
   "created_at":"--",
   "updated_at":"--",
   "roles":[
      {
         "id":1,
         "name":"Super Admin",
         "guard_name":"web",
         "created_at":"--",
         "updated_at":"--",
         "pivot":{
            "model_id":1,
            "role_id":1,
            "model_type":"App\\Models\\User"
         }
      }
   ]
}

我需要退回的东西

{
   "id":1,
   "name":"User name",
   "email":"User email",
   "email_verified_at":null,
   "company":"--",
   "phone":"--",
   "created_at":"--",
   "updated_at":"--",
   "roles":["Super Admin"]
}

【问题讨论】:

  • return $request->user()->getRoleNames()->pluck('name');

标签: php laravel eloquent laravel-permission


【解决方案1】:

另一种选择是使用hiddenappends 和访问器,例如getRoleNamesAttribute()

class User extends Model {
  ...

  // This will hide `roles` from your `User`, when converted to JSON/Array/etc
  protected $hidden = ['roles'];

  // This will add `role_names` to your `User`, when converted to JSON/Array/etc
  protected $appends = ['role_names'];

  // Accessible via `$user->role_names`, or `user.role_names` in JSON
  public function getRoleNamesAttribute() {
    return $this->roles->pluck('name'); 
  }

  ... // Everything else
}

这样做,结合return $request->user(); 将自动使roles 不可见,并附加role_names。在您的代码中,您应该得到输出:

{
   "id":1,
   "name":"User name",
   "email":"User email",
   "email_verified_at":null,
   "company":"--",
   "phone":"--",
   "created_at":"--",
   "updated_at":"--",
   "role_names":["Super Admin"]
}

【讨论】:

  • 从长远来看,这种方法看起来很棒,我确实尝试过使用属性,但我认为我需要将角色添加到 hidden 才能工作,这是我第一次没有这样做的。谢谢你的回复,我会用这个而不是我的。我会接受它作为向其他人说明这一点的答案。
  • 从长远来看肯定更容易维护;只需要修改一个点与许多调用相比要好得多。如果你有嵌套的模型/关系可能会有点混乱,每个模型/关系都有自己的隐藏/可见/附加/等,但是一旦你了解了它是如何工作的,那就太好了:)
【解决方案2】:

向用户对象添加roles,就像这样

$user = $request->user();
$user->roles = $user->roles()->pluck('name');
return $user;

【讨论】:

  • 我应该提到这种方法非常好,但是如果你有多个地方需要这样做,那么维护它会很痛苦:)
【解决方案3】:

你也可以这样做:

$user->roles = User::find($user->id)->getRoleNames();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2020-10-08
    • 1970-01-01
    • 2016-12-26
    • 2021-04-06
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多