NestJS中Prisma多对多查询:筛选至少含指定角色的用户
解决Prisma多对多关联中筛选包含所有指定角色的用户问题
需求:在NestJS项目(使用Prisma 5.11.0)中,查询users实体时,需要筛选出至少包含指定角色ID列表(例如ID为1和2的角色)的用户。用户与角色为多对多关联,允许用户拥有其他角色,但必须包含所有指定的角色。
已尝试的无效方案
- 使用
some+in条件:返回的是拥有指定列表中至少一个角色的用户,不符合需求{ roles: {some: {id: {in: [1, 2]}}} } - 使用
every条件:仅筛选出恰好只有指定角色列表的用户,同样不符合需求
模型定义
model User { id Int @id @default(autoincrement()) //... roles Role[] @relation("Roles") } model Role { id Int @id @default(autoincrement()) //... users User[] @relation("Roles") }
正确查询方案
核心思路是通过AND组合多个some条件,每个条件对应一个指定的角色ID,确保用户同时拥有所有这些角色。这种方式允许用户拥有额外角色,只要包含全部指定角色就会被匹配。
示例代码:
// 目标角色ID列表,可动态传入 const targetRoleIds = [1, 2]; const qualifiedUsers = await prisma.user.findMany({ where: { AND: targetRoleIds.map(roleId => ({ roles: { some: { id: roleId } } })) }, // 可选:返回用户时包含关联的角色信息 include: { roles: true } });
说明
- 利用数组映射动态生成
AND条件列表,适配任意长度的目标角色ID数组,无需硬写每个条件 - 每个
some: { id: roleId }确保用户拥有该特定角色,AND则保证所有指定角色都被满足
内容的提问来源于stack exchange,提问作者Loudrous
相关产品推荐
相关产品推荐

