laravel的急切加载/更改器/访问器澄清

时间:2018-10-01 13:40:01

标签: laravel eager-loading accessor mutators

我正在制作一个laravel应用程序,我需要为其所有用户加载附加的角色,而无需嵌套任何角色。我将本教程用作角色:https://medium.com/@ezp127/laravel-5-4-native-user-authentication-role-authorization-3dbae4049c8a。如果我在用户模型上使用public $with = ['roles'];,它将返回用户对象内的整个角色对象,而我只需要返回角色:'role_name';

 /**
 * set up eloquent between roles/user
 *
 * @return \Illuminate\Database\Eloquent\Relations\belongsToMany
 */
public function roles() 
{
    return $this->belongsToMany(Role::class);
}

上面在我的用户模型中,下面在我的角色模型中,用于定义关系。

 /**
 * provides a many-to-many relationship to User model
 *
 * @return User::class
 */
public function users()
{
  return $this->belongsToMany(User::class);
}

我认为是通过将其添加到用户模型中来的:

protected $appends = ['role_name'];

public function getRoleNameAttribute()
{
    return $this->attribute['name'];
}

它将返回所有内容,但它所做的只是创建一个role_name:'user_name';在模型上。因此,我想我意识到我只访问数据库中的Users表,而不访问Roles表,但又不确定要做什么。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

如果为了方便起见,您需要直接从模型中访问角色名称,则应参考实际的关系数据:

protected $appends = ['role_name'];

public function getRoleNameAttribute()
{
    return $this->roles()->pluck('name');
}

这应将角色名称数组附加到您的用户模型。这将是一个数组,因为角色似乎与User模型具有多对多关系。

答案 1 :(得分:1)

问题是您要在$this->attributes['name']中返回getRoleNameAttribute。您需要role names,所以您应该执行以下操作:

如果要使用名称为数组的

return $this->roles()->pluck('name')

如果要将名称作为字符串:

return array_implode(", ", $this->roles()->pluck('name')->toArray());