Prisma多对多关联查询如何省略中间表直接返回关联Group数组
方案1:无需修改模型,仅调整查询逻辑
仅需在查询后加一层极轻量的数组映射即可,性能损耗可以忽略不计:
const result = await prisma.permission.findUnique({ where: { id: id }, select: { id: true, name: true, groups: { select: { group: true } } } }) // 扁平化处理得到目标格式 const formattedResult = { ...result, groups: result.groups.map(item => item.group) }
方案2:修改Prisma模型配置,一劳永逸无需额外处理
你可以给Permission和Group模型增加逻辑层面的多对多关联,无需修改现有数据库表结构,后续查询可直接拿到目标格式:
第一步:调整模型定义
model Permission { @@map(name: "permission") id Int @default(autoincrement()) @id name String @db.VarChar(255) // 原中间表关联重命名 permissionInGroups PermissionInGroup[] // 新增直接关联Group的多对多字段 groups Group[] @relation("PermissionToGroup", through: PermissionInGroup) } model Group { @@map(name: "group") id Int @default(autoincrement()) @id name String? // 原中间表关联重命名 permissionInGroups PermissionInGroup[] // 新增反向多对多关联 permissions Permission[] @relation("PermissionToGroup", through: PermissionInGroup) users UserInGroup[] domain Domain @relation(fields: [domainId], references:[id]) domainId Int } model PermissionInGroup { @@map(name: "permission_in_group") id Int @id @default(autoincrement()) permission Permission @relation(fields: [permissionId], references:[id]) permissionId Int group Group @relation(fields: [groupId], references: [id]) groupId Int }
第二步:直接查询即可拿到目标格式
const result = await prisma.permission.findUnique({ where: { id: id }, include: { groups: { select: { id: true, name: true, domainId: true } } } })
返回结果的groups字段就是你需要的Group对象数组,无需额外处理。
内容的提问来源于stack exchange,提问作者Fejac
相关产品推荐
相关产品推荐

