如何在 prisma 中使用 connectOrCreate 进行多对多操作

jsu*_*969 4 database blogs prisma

我想使用Prisma将文章与标签关联起来,即:一个帖子有多个标签,一个标签属于多个帖子
但是Prisma中的例子会导致创建重复的标签

这是我的 Prisma 模型

model Article {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  title     String
  summary   String
  link      String   @unique
  archive   String
  content   String
  image     String
  tags      Tag[]
}

model Tag {
  id       Int       @id @default(autoincrement())
  name     String
  articles Article[]
}
Run Code Online (Sandbox Code Playgroud)

这是我根据文档的代码,它会导致出现重复的标签

model Article {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  title     String
  summary   String
  link      String   @unique
  archive   String
  content   String
  image     String
  tags      Tag[]
}

model Tag {
  id       Int       @id @default(autoincrement())
  name     String
  articles Article[]
}
Run Code Online (Sandbox Code Playgroud)

当我使用connectOrCreate时,在多对多模式下报错

await prisma.article.create({
  data: {
    title,
    summary,
    link,
    archive,
    content,
    image,
    tags: {
      create: tags.map((tag) => ({ name: tag })),
    },
  },
});

Run Code Online (Sandbox Code Playgroud)

Tas*_*mam 17

代码中有两个错误。

Tag.name字段不唯一

根据我从您的域中推断出的信息,两个标签不应具有相同的名称。此外,由于该name字段不是唯一的,因此您不能单独使用它来唯一标识特定Tag记录,因此如果您尝试仅传递条件name下的字段,Prisma 会抱怨。whereconnectOrCreate

最简单且合乎逻辑的解决方案是使该name领域独一无二。这是您更新后的标签模型

model Tag {
  id       Int       @id @default(autoincrement())
  name     String    @unique  // change
  articles Article[]
}
Run Code Online (Sandbox Code Playgroud)

语法不正确connectOrCreate

您将单独的数组传递给wherecreate字段。相反,当您想要连接/创建多个记录时,请将对象数组传递给connectOrCreate每个记录及其自己的wherecreate字段。以下是 Prisma 文档中的示例,展示了如何将 connectOrCreate 与多个记录一起使用

您的创建查询应如下所示:

model Tag {
  id       Int       @id @default(autoincrement())
  name     String    @unique  // change
  articles Article[]
}
Run Code Online (Sandbox Code Playgroud)