使用 collection->get() 而不是 collection->pluck()

Use collection->get() instead of collection->pluck()

我正在使用 laravel-permission 来管理角色和显示内容。根据文档,您可以使用 $roles = $user->roles()->pluck('name') 检索用户角色。我的问题是 returned 的数据是 ["admin"] 而不仅仅是 admin。我正在审查收集方法,看起来 get('name') 会 return 我正在寻找的东西。当我尝试使用以下命令时 Auth::user()->roles()->get('name') 我得到

1/1
ErrorException in BelongsToMany.php line 360:
Argument 1 passed to Illuminate\Database\Eloquent\Relations\BelongsToMany::getSelectColumns() must be of the type array, string given

在我看来,get() 方法需要一个数组,但是,我正在尝试引用数组中的一个项目。 Auth::user()->roles()->get() 的原始输出是 [{"id":1,"name":"admin","created_at":"2016-03-10 06:24:47","updated_at":"2016-03-10 06:24:47","pivot":{"user_id":1,"role_id":1}}]

我找到了提取正确内容的解决方法,但它使用正则表达式删除 pluck() 方法中包含的不需要的字符。

preg_replace('/\W/i','', Auth::user()->roles()->pluck('name'))

看来我遗漏了一些东西或错误地使用了 get() 方法。任何建议表示赞赏。

那是因为一个用户可以有多个角色,所以角色是一个集合。 如果您100% 确定 用户将只有一个角色,您可以轻松做到

Auth::user()->roles()->first()->name

这将获得该集合的第一项(角色),然后是它的名称。

我认为 pluck() 将为集合 中的每个模型 return 给定列 的值,这将解释数组。在您的情况下,用户似乎只有一个角色,因此您得到的数组只有一个项目。如果用户有多个角色,您可能会得到一个包含多个项目的数组。

另一方面,get() 方法用于在构建查询后对数据库执行查询。查询的结果是returned。要 return 只有一个值的模型集合,您需要传递一个只包含您想要的一列的数组,但这只会 select 个模型,这似乎不是您最终想要的需要。

您可以试试这个:$roles = $user->roles()->first()->name

对 first() 的调用将获取 return 由 roles() 编辑的集合中的第一个模型,然后您可以从该模型中获取角色的名称。

我通常会对此进行一些错误检查:

$role = $user->roles()->first();

if (is_null($role)) {
    //Handle what happens if no role comes back
}

$role_name = $role->name;