首页 > 解决方案 > 从 2 个深度多对多关系中获取一个集合结果

问题描述

标题有点混乱。角色是用户的多对多关系,权限是角色的多对多关系。但我想获得用户拥有的角色的所有权限。现在我有这样做的代码,但我想也许有更好的方法?

public function hasPermissions(array $permissions = []): bool
{
    $this->loadMissing('roles');

    foreach ($this->roles as $role) {
        foreach ($role->permissions as $permission) {
            if (count($this->getFilteredArray($permissions, 
                $permission['permission'])) > 0) {
                return true;
            }
            dd('hier 2');
        }
    }
    return false;
}

private function getFilteredArray($arrayToFilter, $valueToCheck): array
{
    return array_filter($arrayToFilter, function ($value) use ($valueToCheck) {
        return $valueToCheck === $value;
    });
}

我在这里做的是:我对用户的角色进行循环。然后获取角色的权限,对权限进行for循环,然后检查用户是否有权限*。如果有,则返回 true。否则,转到函数 getFilteredArray 以过滤传递给此方法的权限数组。如果该结果大于 0,则返回 true,否则返回 false。但我认为有一个更好的解决方案。

标签: eloquentnestedmany-to-manylaravel-8laravel-collection

解决方案


这段代码,检查用户是否有角色,循环角色集合并收集与他们相关的权限。返回权限集合,否则为空

$roles = auth()->user()->roles()->exists() ? auth()->user()->roles()->pluck('id') : null;
if($roles) {
  $collection = Role::whereIn('id', $roles)->get();
  $collectPermission = collect();
  foreach($collection as $role) {
     if($role->permissions()->exists()) {
        $role->permissions()->filter(function ($permission) use ($collectPermission) {
         $collectPermission->push($permission);
        });
     }
  }
  return $collectPermission;
}
return null;

推荐阅读