如何在 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
语法不正确
您将单独的数组传递给 where
和 create
字段。相反,当您想要 connect/create 多条记录时,将一个对象数组传递给 connectOrCreate
,每个对象都有自己的 where
和 create
字段。这是来自 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 },
};
}),
},
},
});
我想用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
语法不正确
您将单独的数组传递给 where
和 create
字段。相反,当您想要 connect/create 多条记录时,将一个对象数组传递给 connectOrCreate
,每个对象都有自己的 where
和 create
字段。这是来自 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 },
};
}),
},
},
});