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



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

我有3张桌子:

  • 一个叫做users,它存储所有用户的信息。
  • 一个叫做roles,它存储所有角色的信息(只是id+name)
  • 一个叫做user_roles,它存储用户具有哪些角色。它有一个id列(用于PK),一个user_id列(作为FK到usersid) 和一个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('AppRole');
}
}

模特角色:

class Role extends Model
{
protected $table = 'roles';
protected $fillable = ['role'];
}

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

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

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

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('AppRole');
}

有了这个:

public function roles() {
return $this->belongsToMany('AppRole');
}

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

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

hasManyThrough应该做这个把戏 iirc

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

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

最新更新