You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Prisma查询用户关联角色的关联权限数据?

解决用户权限查询问题

你的报错原因是:User模型中的roles字段对应的是连接表UserRoles的数组,而非直接的Role模型数组。所以你不能直接在roles里嵌套include: { permissions: true },因为UserRoles没有permissions字段。

正确的嵌套查询写法

需要逐层关联查询:从User到UserRoles,再到Role,接着到RolePermissions,最后关联到Permission模型:

const res = await prisma.user.findFirst({
  include: {
    // 先包含用户的UserRoles连接记录
    roles: {
      // 从UserRoles关联到对应的Role
      include: {
        role: {
          // 从Role关联到RolePermissions连接记录
          include: {
            permissions: {
              // 最后从RolePermissions关联到具体的Permission
              include: {
                permission: true
              }
            }
          }
        }
      }
    }
  }
});

提取扁平化的权限列表(可选)

如果需要直接得到该用户的所有权限(自动去重),可以在查询后处理结果:

// 提取所有权限数据
const allPermissions = res.roles.flatMap(userRole => 
  userRole.role.permissions.flatMap(rolePerm => rolePerm.permission)
);

// 根据权限ID去重
const uniquePermissions = [...new Map(allPermissions.map(p => [p.id, p])).values()];

精简查询结果(用select过滤冗余字段)

如果不需要连接表的额外字段(比如assignedAt、assignedBy),可以用select精简返回内容:

const res = await prisma.user.findFirst({
  select: {
    id: true,
    name: true,
    roles: {
      select: {
        role: {
          select: {
            name: true,
            permissions: {
              select: {
                permission: {
                  select: { id: true, name: true }
                }
              }
            }
          }
        }
      }
    }
  }
});

内容的提问来源于stack exchange,提问作者artur1214

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:19:54