当前位置: 首页 > 知识库问答 >
问题:

Mutli与Elount和Laravel的关系

程和煦
2023-03-14

我有6张桌子:

permissions:
id
permission_name

roles:
id
role_name

user_roles:
id 
user_id 
role_id

user_permissions:
id 
user_id 
permission_id

role_permissions:
id
role_id
permission_id

users:
id
username
email

现在,我想添加一个自定义函数到我的雄辩模型中的权限名为getUsersBackPersion()。

现在,用户可能拥有他所赋予的角色的权限(用户表在user_roles上连接,在role_permissions上连接该表,最后一个表在权限上连接。

或者用户在用户权限表中设置了特定权限(在用户表上加入用户权限表,在用户权限表上加入权限表)

如何创建一个雄辩的模型函数,返回所有具有特定权限的用户,比如说:“notification.error.process”,其中是权限名称

hasMany并不能完全满足我的需要(我不能在其中定义多个表)。我使用的是Laravel 5.6。

共有2个答案

闻人杰
2023-03-14

试着用这个ER图来理解您的表结构。

要处理这种情况,您可以创建3个“雄辩的模型”

  1. 用户
  2. 角色
  3. 权限

在每个模型中,您可以创建与其他模型之间的belongtomany()关系。

一个例子,关于“用户模型”

public function permissions()
{
    // need to define any other differences in your tables foreign keys as  2nd, 3rd parameters and so on.
    return $this->belongsToMany(Permission::class);
}

现在,您需要获取所有用户的“谁拥有一个拥有特权的角色”或“谁直接拥有特权”。

这样做。

$users = User::whereHas('privileges', function($query) {
    $query->where('permission_name', 'notification.error.process');
})->orWhereHas('roles.permissions', function($query) {
    $query->where('permission_name', 'notification.error.process');
})->get();

我希望你会得到一个想法。你的代码可能和我的略有不同。但这是概念。

谢胤
2023-03-14

如果您正确定义了多对多关系(用户权限和用户角色权限),则以下操作可以实现此目的:

$permissionName = 'notification.error.process';
$usersWithPermission = User::whereHas('permissions', function($query) use ($permissionName) {
  $query->whereName($permissionName);
})->orWhereHas('roles.permissions', function($query) use ($permissionName) {
  $query->whereName($permissionName);
})->get();
 类似资料:
  • 插入新记录或更新(如果存在)的缩写是什么?

  • 以前我使用过的ORM将数据库列直接映射到类属性,这允许您查看特定的属性可见性,就像您通常会限制对某些属性(例如密码)的访问一样。 有了雄辩,我似乎无法复制这一点,因为数据库列映射到不包含可见性的内部属性数组。 我的愿望是将用户密码的访问范围仅限于对象,即私有。 设置具有可见性的类属性不起作用,因为该属性超出了雄辩模型属性的范围,因此该属性未映射到列。 雄辩的$隐藏和$保护属性不起作用,因为它们处理

  • mutli-cache Java多级缓存框架 L1: 进程内缓存(ehcache) L2: 集中式缓存,支持多种集中式缓存服务器,如 Redis 缓存任意切换 可使用单一缓存,ehcache或redis 支持redis集群,代码无需任何改动 支持 JGroups 和 Redis Subscribe 两种方式进行缓存同步。在某些云平台上可能无法使用 JGroups 组播方式,可以采用 Redis 发

  • 我有三张桌子: 类别(id、名称) 类别赛(类别赛id,锦标赛id)-- Category是可用类别列表Category_Tornament是管理员配置的类别列表Category_Tornament用户是用户已注册的类别 要获得锦标赛中的所有类别,我可以使用以下工具轻松完成: 在竞赛模型中定义归属关系 我不知道如何定义与上一个表的关系。 我需要的是用户单击几个类别,我可以运行如下操作: 我应该在哪

  • 我有三种型号:发票、发票项和产品。 每个发票都与Invoiceitems模型有许多关系。 每个发票项目与产品模型有一个关系。 我需要计算产品类别为4的Invoiceitem产品金额的总和。 表结构 发票 id |日期|总金额| 发票项目 id|发票|product_id|product_amt|数量|total_amt 产品 ID|product_name|category_id 关系 发票模型

  • 我试着补充: 并用调用,但响应为空。