typescript 使用prisma连接多对多关系释放现有连接

3mpgtkmj  于 2023-06-07  发布在  TypeScript
关注(0)|答案(1)|浏览(194)

使用prisma和nest,我有以下多对多关系模式。

model Message {
  id        Int       @id @default(autoincrement())
  message   String
  createdAt DateTime  @default(now())
  updatedAt DateTime  @updatedAt
  tags      Tags[]
}

model Tags {
  id        Int      @id @default(autoincrement())
  tag       String   @unique
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  Message   Message? @relation(fields: [messageId], references: [id])
  messageId Int?
}

当我创建一条消息并分配标签时,它工作得很好。这里是create函数的一部分。

create(createMessageDto: CreateMessageDto) {
    return this.prisma.message.create({
    data: {
        message: createMessageDto.message,
        tags: {
            connectOrCreate: createMessageDto.tag.map((tag) => ({
            where: { tag: tag },
            create: { tag: tag },
            })),
            },
        },
    });
}

这对每一条消息都很有效。但是当我在不同的消息中使用相同的标签时,只有最新的消息链接到标签。这似乎不是多对多的关系,而是一对多的关系。
我犯的错误在哪里?
www.example.com和SO中的所有文档prima.io都无法提供帮助。

g6ll5ycj

g6ll5ycj1#

在您当前的Prisma模式中,Message和Tags之间的关系没有定义为多对多关系,而是一对多关系。显式的多对多关系涉及一个中间“联接表”,它连接另外两个表。

model Message {
  id        Int       @id @default(autoincrement())
  message   String
  createdAt DateTime  @default(now())
  updatedAt DateTime  @updatedAt
  tags      MessageTag[]
}

model Tags {
  id        Int      @id @default(autoincrement())
  tag       String   @unique
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  messages  MessageTag[]
}

model MessageTag {
  messageId Int
  tagId     Int
  message   Message @relation(fields: [messageId], references: [id])
  tag       Tags    @relation(fields: [tagId], references: [id])

  @@id([messageId, tagId])
}

在这个模式中,MessageTag是连接Message和Tags的连接表。MessageTag中的每一行都表示一条消息和一个标记之间的链接,一条消息或标记可以链接到多行。

相关问题