获取来自用户和角色的总权限AboutToMany

时间:2018-11-24 06:11:25

标签: php laravel eloquent relationship

我有3种型号:

  • 用户
  • 角色
  • 权限

注意:

  • 用户可以具有直接权限
  • 角色可以拥有权限
  • 用户可以扮演角色

我正在尝试通过用户的直接权限或通过角色权限来获取用户拥有的总权限。因此,我需要将两者合并为1个集合并计算总数。

我已经为UserRole建立了EmiratesToMany关系:

public function permissions()
{
    return $this->belongsToMany('App\Permission');
}

我该怎么做?

3 个答案:

答案 0 :(得分:0)

我通过flatMap知道了。

答案 1 :(得分:0)

您需要使用hasManyThrough关系

以下是文档的链接:Eloquent Documentation

所以您将执行以下操作:

public function permissions()
{   
    $directPermissions = $this->belongsToMany('App\Permission'); 
    $rolePermissions = $this->hasManyThrough('App\Permissions', 'App\Role');
    return $directPermissions->merge($rolePermissions);
}

答案 2 :(得分:0)

我不确定,但这会有所帮助 打开您的user model

public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }

public function hasRole(...$roles)
    {

        foreach($roles as $role)
        {
            if($this->roles->contains('name',$role))
            {
                return true;
            }
        }
        return false;
    }

   public function hasPermission($permission)
    {
        return $this->hasPermissionThroughRole($permission) || (bool) $this->permissions->where('name',$permission->name)->count();
    }

    public function hasPermissionThroughRole($permission)
    {
        foreach($permission->roles as $role)
        {
            if($this->roles->contains($role))
            {
                return true;
            }
        }
        return false;
    }

然后打开您的Role Model并添加这些

public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }

public function users()
    {
        return $this->belongsToMany(User::class);
    }

并打开您的permission model

public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

public function users()
    {
        return $this->belongsToMany(User::class);
    }

并最终启动对角色和用户的所有权限 运行命令php artisan make:provider PermissionServiceProvider

打开您新创建的服务提供商,然后

添加

use App\Permission;
use Illuminate\Support\Facades\Gate;

通过boot方法添加代码

Permission::get()->map(function ($permission) 
            {
                Gate::define($permission->name, function ($user) use ($permission) 
                {
                    return $user->hasPermission($permission);
                });
            });

希望它对您有所帮助,请在下方评论