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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 20:15:13