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

时间:2016-03-11 21:34:26

标签: php laravel methods collections laravel-5.2

我正在使用laravel-permission来管理角色和显示内容。根据文档,您可以使用$roles = $user->roles()->pluck('name')检索用户角色。我的问题是返回的数据是["admin"],而不仅仅是admin。我正在审查集合方法,看起来get('name')会返回我想要的内容。当我尝试使用以下命令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()方法。任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:1)

那是因为用户可以拥有多个角色,因此角色是一个集合。 如果您 100%确定用户只有一个角色,您可以轻松完成

web.config

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

答案 1 :(得分:1)

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

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

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

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

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

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

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

$role_name = $role->name;