如何在 prisma 中使用多对多的 connectOrCreate

How to use connectOrCreate with many to many in prisma

我想用Prisma给文章关联标签,即:一个post有多个标签,一个标签属于多个posts
但是 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[]
}

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

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

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

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

代码中有两个错误。

Tag.name 字段不唯一

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

where 条件中的字段

对此最简单且合乎逻辑的解决方案是使 name 字段唯一。这是您更新后的标签模型

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

connectOrCreate

语法不正确

您将单独的数组传递给 wherecreate 字段。相反,当您想要 connect/create 多条记录时,将一个对象数组传递给 connectOrCreate,每个对象都有自己的 wherecreate 字段。这是来自 Prisma Docs 的示例,显示 how to use connectOrCreate with multiple records.

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

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