在我的网站上,我具有用户,角色和权限。
每个用户都属于多个角色(例如User.php)和名为“ role_user”的数据透视表
public function roles()
{
return $this->belongsToMany(Role::class);
}
每个角色都属于许多权限(例如Role.php)和名为“ permission_role”的数据透视表
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
我想以某种方式访问“用户”权限,但似乎无法弄清楚。基本上我在User.php上需要这样的东西
public function permissions()
{
return $this->roles()->permissions();
}
这可能吗?请帮忙。谢谢。
答案 0 :(得分:1)
Laravel不支持直接关系。
我为此情况创建了一个程序包:https://github.com/staudenmeir/eloquent-has-many-deep
您可以像这样使用它:
class User extends Model {
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
public function permissions() {
return $this->hasManyDeep(
Permission::class, ['role_user', Role::class, 'permission_role']
);
}
}
答案 1 :(得分:0)
如果您使用的是JSON格式的结果,那么如果实现Eloquent Resources
,这应该非常容易定义以下三种资源:
(注意:要轻松定义如下所示的资源,请执行以下操作:
php artisan make:resource UserRes
然后根据需要修改toArray函数。 )
UserRes
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class UserRes extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$user = parent::toArray($request);
$user["roles"] = RolesRes::collection($this->roles);
return $user;
}
}
RolesRes
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class RolesRes extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$res = parent::toArray($request);
$res["permissions"] = $this->permissions;
return $res;
}
}
权限Res:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class PermissionsRes extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$perm = parent::toArray($request);
return $perm;
}
}
在我的应用中,这是获取单个用户时结果示例的屏幕截图。请注意具有多个权限的多个角色的嵌套。 Screenshot of a JSON response when querying a single user