Prisma多对多关系场景下如何将可变数量用户关联到对应report?
Prisma显式多对多关联批量操作解决方案
你当前使用的是手动定义中间表的显式多对多关联,根据不同业务需求可选择以下实现方式,天然支持任意长度的关联数组:
1. 场景:仅新增关联,保留原有旧关联
如果不需要删除该报告之前绑定的作者,只需要新增传入的作者关联,直接用update+createMany即可,是性能最高的实现方案:
注意先对传入的
report_author数组按author_id去重,避免插入无效重复数据
// 第一步:去重处理传入的作者关联 const uniqueAuthorList = Array.from( new Map(req.body.report_author.map(item => [item.author_id, item])).values() ) // 第二步:执行更新操作 const result = await prisma.report.update({ where: { id: req.body.id }, data: { // 更新报告自身字段 type: req.body.type, content: req.body.content, appreciation: req.body.appreciation, meeting_id: req.body.meeting_id, // 批量插入作者关联 report_author: { createMany: { data: uniqueAuthorList.map(item => ({ author_id: item.author_id })), // 遇到重复关联自动跳过,避免报错 skipDuplicates: true } } } })
嵌套在report.update下的createMany会自动填充report_id字段,不需要手动传入,只需指定author_id即可
2. 场景:覆盖旧关联,仅保留新传入的关联
如果需要先清空该报告之前绑定的所有作者,再插入新的关联,在上述逻辑基础上增加deleteMany即可:
const result = await prisma.report.update({ where: { id: req.body.id }, data: { type: req.body.type, content: req.body.content, appreciation: req.body.appreciation, meeting_id: req.body.meeting_id, report_author: { // 先删除该报告所有旧关联 deleteMany: {}, // 再插入新关联 createMany: { data: uniqueAuthorList.map(item => ({ author_id: item.author_id })), skipDuplicates: true } } } })
方法选择说明
- 优先用
update:你已经明确指定了report的id,确定该报告存在的场景下,update是性能最高的选择 - 什么时候用
upsert:如果你不确定传入的report id是否存在,需要实现「不存在就新建报告+关联,存在就更新」的逻辑,才需要用到upsert - 什么时候用
connect:只有当你用Prisma隐式多对多(未手动定义中间表)时才用connect数组,你当前是显式定义了report_author中间表,直接操作中间表的createMany效率更高
内容的提问来源于stack exchange,提问作者Mathieu Gervais
相关产品推荐
相关产品推荐

