【问题标题】:Clarification with eager loading/mutators/accessors for laravel对 laravel 的急切加载/修改器/访问器进行澄清
【发布时间】:2019-03-06 15:25:39
【问题描述】:

我正在为工作制作一个 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'];
}

它会返回所有内容,但它所做的只是创建一个角色名称:'user_name';在模型上。所以我想我意识到我正在访问的只是用户表而不是数据库中的角色表,但再次不确定该怎么做。任何帮助将不胜感激。

【问题讨论】:

    标签: laravel eager-loading accessor mutators


    【解决方案1】:

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

    protected $appends = ['role_name'];
    
    public function getRoleNameAttribute()
    {
        return $this->roles->pluck('name');
    }
    

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

    【讨论】:

    • 唯一的事情是:return $this->roles()->pluck('role_name');应该是 return $this->roles()->pluck('name');但这很棒。非常感谢。
    • 如果没有预先加载 roles 关系,您将通过访问自定义访问器内部的关系遇到 N+1 查询情况。
    • @alexw 你是对的,你会遇到 N+1 问题。您可以通过在模型中添加 protected $with = [ 'roles' ] 来避免它,因为它总是附加的,所以总是急切地加载关系
    【解决方案2】:

    问题是您在getRoleNameAttribute 中返回$this->attributes['name']。你想要role names,所以你会做这样的事情:

    如果你想要一个带有名字的数组:

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

    如果您希望将名称作为字符串:

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

    【讨论】:

    • 唯一的事情是: return $this->roles->pluck('name') 应该是 return $this->roles()->pluck('name') 。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2021-04-17
    • 1970-01-01
    • 2017-09-19
    相关资源
    最近更新 更多