NodeJS 尝试使用prisma在多对多关系中创建5个标签,但出现错误

tjvv9vkg  于 2023-01-16  发布在  Node.js
关注(0)|答案(1)|浏览(249)

我尝试创建一个有4个答案和5个标签的问题,但当我尝试创建多个标签时,我得到这个错误:键入“{创建:{名称:字符串;}[]; }'不能赋值给类型' never ',但是当我只创建一个标签时,它就可以正常工作了。

这给了我错误:键入“{创建:{名称:字符串;“}[]; }”不能赋给类型“never”

const savedQuestion = await this.prisma.question.create({
        data: {
          tema: createQuestionDto.tema,
          questao: createQuestionDto.questao,
          nivel: createQuestionDto.nivel,
          answer: {
            create: [
              {texto: createQuestionDto.answer[0].texto},
              {texto: createQuestionDto.answer[0].texto},
              {texto: createQuestionDto.answer[0].texto},
              {texto: createQuestionDto.answer[0].texto},
            ],
          },
          question_tags: {
            create: {
              tags: {
                create: [
                  {nome: "test"},
                  {nome: "test"},
                  {nome: "test"},
                  {nome: "test"},
                  {nome: "test"},
                ],
              },
            },
          },
        },
      });

这可以正常工作,但只创建一个标记

const savedQuestion = await this.prisma.question.create({
        data: {
          tema: createQuestionDto.tema,
          questao: createQuestionDto.questao,
          nivel: createQuestionDto.nivel,
          answer: {
            create: [
              {texto: createQuestionDto.answer[0].texto},
              {texto: createQuestionDto.answer[0].texto},
              {texto: createQuestionDto.answer[0].texto},
              {texto: createQuestionDto.answer[0].texto},
            ],
          },
          question_tags: {
            create: {
              tags: {
                create: {nome: "test"},      
              },
            },
          },
        },
      });

我的海报

create table QUESTION (
    id serial primary key,
    tema varchar(255) not null,
    questao text not null,
    NIVEL NIVEL not null
);

create table TAGS(
    id serial primary key,
    nome varchar(255) not null
);

create table QUESTION_TAGS(
    question_id int not null references question(id),
    tags_id int not null references tags(id),
    primary key (question_id, tags_id)
);

create table ANSWER(
    id serial primary key,
    texto text not null,
    question_id int not null references question(id)
);

CREATE TYPE NIVEL AS ENUM ('facil', 'medio', 'dificil', 'muito dificil', 'expert');

棱镜架构

model quetion{
  id            Int             @id @default(autoincrement())
  tema          String          @db.VarChar(255)
  questao       String
  nivel         nivel
  question_tags question_tags[]
  answer        answer[]
}

model answer{
  id          Int      @id @default(autoincrement())
  texto       String
  question_id Int
  question    question @relation(fields: [question_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

model tags {
  id            Int             @id @default(autoincrement())
  nome          String          @db.VarChar(255)
  question_tags question_tags[]
}

model question_tags {
  question_id Int
  tags_id     Int
  question    question @relation(fields: [question_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
  tags        tags     @relation(fields: [tags_id], references: [id], onDelete: NoAction, onUpdate: NoAction)

  @@id([question_id, tags_id], map: "Pergunta_Tags_pk")
}
eqqqjvef

eqqqjvef1#

我花了一段时间才意识到这段代码在做什么。你的代码不必要地复杂。让我们一步一步地分解它在做什么。
1.它正在创建一个包含一个question_tags的问题。
1.根据架构,一个question_tags可以有一个tags
1.在第一个代码片段中,您创建了fivetags,并将它们分配给onequestion_tags(一个question_tags只能有onetags),因此您得到了一个类型错误。
1.第二个代码片段修复了类型错误,只将onetags赋值给question_tags
现在,您需要五个question_tags,每个question_tags都有一个单独的tags。为此,您需要在question_tags[]数组中有多个create对象。它看起来如下所示(在数组中添加更多create对象)。

const savedQuestion = await this.prisma.question.create({
  data: {
    tema: createQuestionDto.tema,
    questao: createQuestionDto.questao,
    nivel: createQuestionDto.nivel,
    answer: {
      create: [
        { texto: createQuestionDto.answer[0].texto },
        { texto: createQuestionDto.answer[0].texto },
        { texto: createQuestionDto.answer[0].texto },
        { texto: createQuestionDto.answer[0].texto },
      ],
    },
    question_tags: [
        
        //The first question_tags gets created because of this block of code
      {
        create: {
          tags: {
            create: { nome: "test" },
          },
        },
      },

        //The second question_tags get created because of this block of code
      {
        create: {
          tags: {
            create: { nome: "test" },
          },
        },
      },
      
    ],
    
  },
});

我还想提几件事:
1.尽量用英语命名变量,并且尽可能的描述性。正确的变量命名是最容易做到的事情之一,可以让你的代码“更干净”。
1.您可能不希望这样设计数据库。我会使用tags + enumsquestion_tags + enums。我不会让question_tags引用tags。这会使代码更难理解。

相关问题