从数据库中获取当前管理员

时间:2014-08-20 20:01:26

标签: php laravel eloquent

我正在使用 laravel 为我的青少年运动创建一个网站。我目前为我的角色设置了三个表:UsersRolesrole_user。他们看起来如下:

+-------+     +-------+     +-----------+
| Users |     | Roles |     | role_user |   
+-------+     +-------+     +-----------+
| id    |     | Id    |     | user_id   |
| Name  |     | Name  |     | role_id   |
+-------+     +-------+     | start     |
                            | stop      |
                            +-----------+

user_role表是usersroles之间的数据透视表。用户可以在从role_user.startrole_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

2 个答案:

答案 0 :(得分:0)

假设您始终需要startstop之间的所有角色,您可以为您的关系添加一些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);

根据您startstop中的时间戳格式,您可能需要正确格式化$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();