我正在使用 laravel 为我的青少年运动创建一个网站。我目前为我的角色设置了三个表:Users
,Roles
和role_user
。他们看起来如下:
+-------+ +-------+ +-----------+
| Users | | Roles | | role_user |
+-------+ +-------+ +-----------+
| id | | Id | | user_id |
| Name | | Name | | role_id |
+-------+ +-------+ | start |
| stop |
+-----------+
user_role
表是users
和roles
之间的数据透视表。用户可以在从role_user.start
到role_user.stop
定义的特定时间内担任某个角色。
我正在尝试在我的User
模型中创建一个函数来检查用户是否是管理员,这可以是用户角色1或2,但用户也可以拥有更多角色。
我已经尝试过不同的方法来实现这一点,但它正在变得复杂,它永远不会起作用。
关系已经正确,我确信这是因为我也在其他函数中使用它们。
例如:
的 user.php的:
/**
* Find the roles for this user.
*/
public function user_roles()
{
return $this->belongsToMany('Role')->withPivot('start', 'stop');
}
任何人都可以帮我吗?
提前致谢, Jerodev
答案 0 :(得分:0)
假设您始终需要start
和stop
之间的所有角色,您可以为您的关系添加一些where()
。
public function user_roles()
{
$now = \Carbon\Carbon::now();
return $this->belongsToMany('Role')->withPivot('start', 'stop')->where('start', '<', $now)->where('stop', '>', $now);
}
此外,您可以使用Carbon
的方法做更多事情:
\Carbon\Carbon::now()->subDays(2);
根据您start
和stop
中的时间戳格式,您可能需要正确格式化$now
。
答案 1 :(得分:0)
根据您粘贴的表格,您的关系不正确。它缺少表名(Eloquent默认查找role_user
)。
因此,这是该数据透视表的名称,或者它不起作用,您应该:
public function user_roles()
{
return $this->belongsToMany('Role', 'user_role');
}
无论如何,要得到你的管理员:
public function adminRoles()
{
$now = \Carbon\Carbon::now();
return $this->belongsToMany('Role')
->wherePivot('start', '>=', $now)
->wherePivot('stop', '<=', $now)
->wherePivot(function ($q) {
$q->whereIn('role_id', [1,2]);
})
->withPivot('start', 'stop');
}
您也可以使用CURRENT_TIMESTAMP
代替Carbon。
当然,这不是最好的解决方案,因为角色是硬编码的。所以调整它以满足您的需求。
然后选择管理员用户:
User::has('adminRoles')->get();