php - Laravel Auth::user()->roles()->get() 为空

标签 php laravel

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

我有 3 张 table :

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

我有 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'];
}

现在,我在一个 Controller 中所做的是添加以下行:

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

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

最佳答案

用户 - 角色是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 会弄清楚它(它是如何做到的,也在文档中) )。

关于php - Laravel Auth::user()->roles()->get() 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49090403/

相关文章:

php - 拉维尔 5.1 : How to limit account access so one account can be accessed at one time

php - 有时允许动态 SQL 而不进行清理是否可以?

PHP应用结构

具有透明背景的PHP图像复制

php - 如何在 MAC 中安装 Laravel 的 mssql 驱动程序 (sqlsrv)?

php - 更新用户组 OctoberCMS rainlab 用户插件

php - 从 PHP 脚本发送数组

php - Laravel Eloquent 链式方法返回 true 而不是模型

json - laravel 按数据字段为用户选择通知

mysql - 如何在 Laravel 的 MySQL 中通过查询插入 [Spatial Point] 值