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

在Prisma ORM中创建含多关联的Exam实例的语法问题

解决Prisma中创建Exam实例的关联问题

问题背景

需要在Prisma ORM中创建Exam实例,满足以下关联要求:

  • createdBy关联创建考试的Teacher
  • availableClasses关联可访问该考试的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],
    },
});

错误原因分析

  1. 关联对象传递错误:createdBy关联的是Teacher模型,但代码中传递的是User对象,且Prisma创建关联时需要使用connect语法关联已存在的记录,而非直接传对象。
  2. 中间表关联语法错误:availableClasses对应中间表AvailableExamsOfClasses,不能直接传入Class对象,需要通过create生成中间表记录并关联已有的Class。
  3. 空数组无需显式传递: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:01:00