【问题标题】:Laravel Auth::user()->roles()->get() is emptyLaravel Auth::user()->roles()->get() 为空
【发布时间】:2018-08-11 22:11:03
【问题描述】:

我开始学习一些 Laravel。我正在一个网站上工作,您可以在其中创建一个帐户,该帐户可以具有角色,并且根据您拥有的角色,您可以做一些事情。它是什么并不重要,但让我解释一下整个情况。

我确实有 3 张桌子:

  • 一个叫做users,它存储所有用户的信息。
  • 一个名为roles,它存储有关所有角色的信息(仅id + name
  • 一个叫user_roles,它存储用户拥有哪些角色。它有一个id 列(用于PK)、一个user_id 列(作为FK 到users.id)和一个role_id 列(作为FK 到roles.id

我确实有 2 个模型:

模型用户:

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 'mood'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
     protected $hidden = [
         'password', 'remember_token',
     ];

     public function roles() {
         return $this->belongsTo('App\Role');
     }
}

模特角色:

class Role extends Model
{
    protected $table = 'roles';

    protected $fillable = ['role'];
}

现在,我在其中一个控制器中所做的是添加以下行:

var_dump(Auth::user()->roles()->get())

所以我得到了我的用户,我已经登录,我确实添加了一个角色,我确实添加了一个新的 user_roles 行(带有我的用户 ID 和我添加的角色的 ID)。但是, var_dump 仍然返回一个空数组,而不是我所拥有的角色。我不明白我做错了什么

【问题讨论】:

  • 我应该用 hasMany 替换 belongsTo ,这取决于你想如何对待角色,可能是多对多的关系

标签: php laravel


【解决方案1】:

User - Role 是 M:M 关系。一个用户可以有多个角色;而且,一个角色可以被多个用户使用。

对于多对多关系,Laravel (Eloquent) 提供了belongsToMany 方法。这是文档:https://laravel.com/docs/5.6/eloquent-relationships#many-to-many

因此,您需要在 User 类中替换此方法:

 public function roles() {
     return $this->belongsTo('App\Role');
 }

用这个:

 public function roles() {
     return $this->belongsToMany('App\Role');
 }

另外,你需要告诉 Laravel 数据透视表的名称。您可以将它作为第二个参数传递给 belongsToMany 方法,或者直接将其命名为 roles_users,Laravel 会弄清楚(文档中也有它是如何做到的)。

【讨论】:

  • 哇,非常感谢!现在我终于可以继续我的项目了:D
  • @Serena 很高兴为您提供帮助。
【解决方案2】:

belongsTo 不是这样工作的,您需要使用不同的关系方法,因为 belongsTo 会检查用户模型中不存在的“roles_id”列。

hasManyThrough 应该可以解决问题 iirc

我不会为您提供直接的解决方案,因为它会带来更多魅力而不是帮助,但您需要阅读 https://laravel.com/docs/5.6/eloquent-relationships 的文档

文档中有示例如何通过中间某处的用户表获取国家/地区帖子。

【讨论】:

    猜你喜欢
    • 2018-07-01
    • 2021-07-29
    • 2017-03-29
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2023-02-04
    • 2017-06-21
    相关资源
    最近更新 更多