我有3种型号:
注意:
我正在尝试通过用户的直接权限或通过角色权限来获取用户拥有的总权限。因此,我需要将两者合并为1个集合并计算总数。
我已经为User
和Role
建立了EmiratesToMany关系:
public function permissions()
{
return $this->belongsToMany('App\Permission');
}
我该怎么做?
答案 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);
});
});
希望它对您有所帮助,请在下方评论