【问题标题】:How to check for a role from an array of roles and return true if any of the role exists, for one to many relationship?对于一对多的关系,如何从角色数组中检查角色并在任何角色存在时返回 true?
【发布时间】:2021-05-02 20:02:49
【问题描述】:

我成功地检查了用户是否只有一个角色。现在我需要在这里检查的是,如果用户是管理员还是员工,并且如果上述任何角色匹配,则返回 true,否则返回 false。我无法这样做,因为我在 usersroles 之间使用一对多关系,所以我无法从一系列角色中检查角色。

  • 数据库结构
Users
---------------
* id
* name
* email
* password
* role_id
* created_at

Roles
---------------
 * id
 * name
 * slug
 * created_at
  • 应用/模型/用户
public function role() 
{
    return $this->belongsTo(Role::class);
}

public function hasRole(string $role) 
{
    if ($this->role()->where('slug', $role)->exists()) {
        return true;
    }
    return false;
}

public function hasAnyRoles(array $roles) 
{
    if ($this->role()->whereIn('slug', $roles)->exists()) {
        return true;
    }
    return false;
}
  • 应用/模型/角色
public function users() 
{
    return $this->hasMany(User::class);
}
  • App/Http/Responses/LoginResponse
public function toResponse($request)
{
    if(Auth::user()->hasAnyRoles(['administrator', 'employee'])) {
        return redirect()->route('backend.dashboard');
    }

    return redirect()->route('frontend.dashboard');
}

【问题讨论】:

  • 您可以只加载该关系,因为它只是一条记录,然后您可以检查该角色 slug
  • 附带说明(如果这不仅仅是一个玩具/实验),Spatie 提供了一个库 laravel-permission,它完全可以满足您的工作需求。
  • @lagbox 请检查LoginResponse,我正在尝试检查用户是否具有管理员角色或员工角色,如果存在上述任何角色,则重定向到后端否则前端。
  • 是的,我知道您在做什么,您可以加载该关系并使用 in_array 来查看 slug 是否在角色数组中
  • @lagbox 你能告诉我代码吗,如果你能抽出一些时间。因为我对如何推进这件事一无所知。已经谢谢了!

标签: php laravel eloquent laravel-8


【解决方案1】:

您可以使用in_array 查看分配的角色的 slug 是否在您传递的数组中:

public function hasAnyRoles(array $roles) 
{
    if ($this->role) {
        return in_array($this->role->slug, $roles);
    }

    return false;
}

【讨论】:

  • 我试过了,但还是一样,我知道这里有什么问题。 ://
  • 那么这个用户没有那个角色或者slugs是错误的
  • 角色已分配,只有当我给一个角色数组进行检查时,它才会发生,当它是一个字符串时,它的工作完美无缺,但如果是数组,角色定义后的事件,这正在发生。
【解决方案2】:

因为它是一对多的反向关系,所以你不能在 whereIn 中做。相反,您可以使用它。

public function role() 
{
    return $this->belongsTo(Role::class);
}

public function hasRole(string $role) 
{
    return $this->role()->where('slug', $role)->exists();
}

public function hasAnyRoles(array $roles) 
{
    if (is_array($roles)) {
        foreach ($roles as $role) {
            if ($this->hasRole($role)) {
                return true;
            }
        }
    }
    
    return false;
}

【讨论】:

  • 我试过了,但还是一样。当我以管理员身份登录时,它会重定向到后端,但当我作为员工时,它仍然是一样的。
  • 正如@lagbox 在他的回答中所说,用户没有该角色或正在传递一个空数组。错误在数据中,而不是在逻辑中。
猜你喜欢
  • 2014-09-26
  • 2015-06-08
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多