使用Prisma保存Quiz与QuizQuestions一对多关联模型报错
解决Prisma一对多关联模型批量创建报错问题
问题背景
存在一对多关联的Quiz和QuizQuestions模型,尝试一次性接收并保存两个模型的关联数据时,执行创建操作触发错误。
模型Schema定义
model Quiz { quiz_id Int @id @default(autoincrement()) quiz_description String @db.VarChar(200) quiz_status Int? @default(1) @db.Integer questions QuizQuestions[] @@map("quiz") } model QuizQuestions { question_id Int @id @default(autoincrement()) id_quiz Int @db.Integer question_description String @db.VarChar(250) question_type Int @db.Integer question_required Boolean @db.Boolean quiz Quiz @relation(fields: [id_quiz], references: [quiz_id]) @@map("questions") }
现有实现代码
控制器代码
@Post() public async saveNewQuiz( @Body() quiz: Prisma.QuizCreateInput ) { const result = await this.quizServiceDB.saveNewQuiz(quiz); return ResponseRest.buildSuccess(result); }
Prisma自动生成的QuizCreateInput类型
export type QuizCreateInput = { quiz_description: string quiz_status?: number | null questions?: QuizQuestionsCreateNestedManyWithoutQuizInput }
服务层代码
public async saveNewQuiz(quiz: Prisma.QuizCreateInput) { const quizRepository = this.prisma.quiz; const quizSaved = await quizRepository.create({ data: quiz }); return { quiz_id: quizSaved.quiz_id }; }
错误信息(中文翻译)
Invalid `prisma.quiz.create()` invocation: { data: { quiz_description: 'test', questions: [ { question_description: 'test', question_type: 2, question_required: false } ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } } Argument questions: 传入了无效值 [ { question_description: 'test', question_type: 2, question_required: false } ]。 预期类型为QuizQuestionsCreateNestedManyWithoutQuizInput,该类型结构如下: type QuizQuestionsCreateNestedManyWithoutQuizInput { create?: QuizQuestionsCreateWithoutQuizInput | 数组 | QuizQuestionsUncheckedCreateWithoutQuizInput | 数组 connectOrCreate?: QuizQuestionsCreateOrConnectWithoutQuizInput | 数组 createMany?: QuizQuestionsCreateManyQuizInputEnvelope connect?: QuizQuestionsWhereUniqueInput | 数组 }
错误原因
Prisma的嵌套关联创建要求子模型字段(此处为questions)必须符合QuizQuestionsCreateNestedManyWithoutQuizInput类型规范,不能直接传入数组,必须通过create/createMany等关键字包裹子模型数据。
修复方案
方案1:通过create字段传递子模型数组
调整请求数据结构,将questions数组包裹在create属性下,或者在服务层对数据进行转换:
调整后请求数据结构示例
{ "quiz_description": "test", "questions": { "create": [ { "question_description": "test", "question_type": 2, "question_required": false } ] } }
服务层转换数据示例(若无法修改前端请求)
public async saveNewQuiz(quizData: any) { const quizRepository = this.prisma.quiz; // 转换为符合Prisma要求的结构 const quiz: Prisma.QuizCreateInput = { quiz_description: quizData.quiz_description, quiz_status: quizData.quiz_status, questions: { create: quizData.questions } }; const quizSaved = await quizRepository.create({ data: quiz }); return { quiz_id: quizSaved.quiz_id }; }
方案2:使用createMany批量创建(高效批量场景)
当需要创建大量子模型时,推荐使用createMany来提升效率:
const quiz: Prisma.QuizCreateInput = { quiz_description: "test", questions: { createMany: { data: [ { question_description: 'test1', question_type: 2, question_required: false }, { question_description: 'test2', question_type: 1, question_required: true } ] } } };
内容的提问来源于stack exchange,提问作者Artur Baldo Ramos
相关产品推荐
相关产品推荐

