我知道hasOneThrough
已经引入了最新的Laravel版本,但是我现在还不能真正升级。做这个的最好方式是什么?
我有一个users
表,我无法更改其结构,但是我需要为这些用户分配一个role
,所以我创建了一个数据透视表,在我的User
模型中添加方法以获取角色,用户只能拥有一个。
表格:
users
user_roles
user_assigned_roles
我可以使用hasManyThrough
,但这会期望很多,我想返回一个模型而不是一个集合。
答案 0 :(得分:1)
您可以结合使用one-to-one和one-to-many关系来管理此问题,然后通过accessor访问角色:
`users` 1 --- 1 `user_assigned_roles` m ---- 1 `user_roles`
因此,在UserAssignedRole
模型中:
/** UserAssignedRole.php */
public function role()
{
return $this->belongsTo('App\UserRole');
}
然后在您的User
模型中:
/** User.php */
public function assigned_role()
{
return $this->hasOne('App\UserAssignedRole');
}
// defining an accessor for your role:
public function getRoleAttribute()
{
return $this->assigned_role->role; // <--- Access the role of 'UserAssignedRole'
}
因此,在您的控制器(或您想要的任何位置)中,您可以执行以下操作:
/** UsersController.php */
public function myFunction()
{
$user = User::find(1);
$role = $user->role; // <--
dd($role->name);
//
}
PS1:我强烈建议您to upgrade to the latest version of Laravel使用这些新功能以及出于安全原因,修复程序等。
PS2:Eloquent Has Many Deep有一个名为Jonas Staudenmeir的软件包,可以为您管理这种关系(以及更多)。