我开始学习一些拉拉维尔。我正在一个网站上工作,您可以在其中创建一个帐户,该帐户可以具有角色,并且根据您拥有的角色,您可以执行操作。它是什么并不重要,但让我解释一下整个情况。
我有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('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
文档包含如何通过中间某处的用户表获取国家/地区帖子的示例。