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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:47:41