在Prisma ORM中创建含多关联的Exam实例的语法问题
解决Prisma中创建Exam实例的关联问题
问题背景
需要在Prisma ORM中创建Exam实例,满足以下关联要求:
createdBy关联创建考试的TeacheravailableClasses关联可访问该考试的Class列表answers存储考试答案(格式如{questionNumber: 1, answer: "A"})results为考试结果数组
用户尝试的代码报错,错误代码如下:
const teacher1 = await prisma.user.findUnique({ where: { TC: "11111111114", }, }); const _9D = await prisma.class.findFirst({ where: { letter: "D", level: 9, }, }); const exam = await prisma.exam.create({ data: { createdBy: teacher1, answers: [ { questionNumber: 1, answer: "E" }, { questionNumber: 2, answer: "B" }, ], results: [], availableClasses: [_9D], }, });
错误原因分析
- 关联对象传递错误:
createdBy关联的是Teacher模型,但代码中传递的是User对象,且Prisma创建关联时需要使用connect语法关联已存在的记录,而非直接传对象。 - 中间表关联语法错误:
availableClasses对应中间表AvailableExamsOfClasses,不能直接传入Class对象,需要通过create生成中间表记录并关联已有的Class。 - 空数组无需显式传递:
results为空数组时可省略,Prisma会默认处理为空关联。
正确实现代码
// 1. 通过User的TC找到对应的Teacher记录 const user = await prisma.user.findUnique({ where: { TC: "11111111114" }, include: { teacherData: true } // 关联查询Teacher数据 }); if (!user?.teacherData) { throw new Error("该用户不是教师"); } // 2. 找到目标班级 const targetClass = await prisma.class.findFirst({ where: { letter: "D", level: 9 }, }); if (!targetClass) { throw new Error("未找到目标班级"); } // 3. 创建Exam实例并关联相关数据 const exam = await prisma.exam.create({ data: { // 关联创建考试的Teacher createdBy: { connect: { id: user.teacherData.id } }, // 存储考试答案 answers: [ { questionNumber: 1, answer: "E" }, { questionNumber: 2, answer: "B" }, ], // 关联可访问的班级(通过中间表创建关联) availableClasses: { create: [ { class: { connect: { id: targetClass.id } } } ] } // 空results数组可省略,若要创建新结果可使用create语法 }, // 可选:查询时返回关联数据 include: { createdBy: true, availableClasses: { include: { class: true } } } }); console.log(exam);
关键语法说明
- 关联已存在记录:使用
connect语法,通过模型的唯一标识(如id)关联已存在的记录。 - 中间表关联:对于多对多关系(Exam和Class通过AvailableExamsOfClasses关联),使用
availableClasses.create生成中间表的关联记录。 - 关联查询:通过
include可以在创建后直接获取关联的详细数据,方便后续使用。
内容的提问来源于stack exchange,提问作者Alper
相关产品推荐
相关产品推荐

