首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从用户获得全部权限&角色belongsToMany

从用户获得全部权限&角色belongsToMany
EN

Stack Overflow用户
提问于 2018-11-24 06:11:24
回答 3查看 850关注 0票数 1

我有三个模特:

  • 用户
  • 角色
  • 权限

注意:

  • 用户可以具有直接权限。
  • 角色可以具有权限。
  • 用户可以有角色

我试图通过用户的直接权限或角色权限获得用户的总权限。因此,我需要将两者合并为一个集合,并计算总数。

我已经为belongsToMany和User建立了Role关系

代码语言:javascript
复制
public function permissions()
{
    return $this->belongsToMany('App\Permission');
}

我该怎么做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-24 06:23:26

我是通过flatMap弄明白的。

票数 0
EN

Stack Overflow用户

发布于 2018-11-24 06:27:28

您需要使用hasManyThrough关系

下面是指向文档的链接:雄辩的文件

所以你会这样做:

代码语言:javascript
复制
public function permissions()
{   
    $directPermissions = $this->belongsToMany('App\Permission'); 
    $rolePermissions = $this->hasManyThrough('App\Permissions', 'App\Role');
    return $directPermissions->merge($rolePermissions);
}
票数 1
EN

Stack Overflow用户

发布于 2018-11-24 10:01:50

我不确定,但这将有助于打开您的user model

代码语言:javascript
复制
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并添加以下内容

代码语言:javascript
复制
public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }

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

打开你的permission model

代码语言:javascript
复制
public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

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

并最终引导角色的所有权限并运行命令php artisan make:provider PermissionServiceProvider

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

添加

代码语言:javascript
复制
use App\Permission;
use Illuminate\Support\Facades\Gate;

boot方法下添加代码

代码语言:javascript
复制
Permission::get()->map(function ($permission) 
            {
                Gate::define($permission->name, function ($user) use ($permission) 
                {
                    return $user->hasPermission($permission);
                });
            });

希望有帮助,如果你发现任何困难,请评论下面

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53455651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档