Prisma 多对多关系:创建和连接
Prisma many-to-many relations: create and connect
在我的 Prisma 架构中,post 和类别之间存在多对多关系。我添加了 @map
选项来匹配 Postgres snake_case 命名约定:
model Post {
id Int @id @default(autoincrement())
title String
body String?
categories PostCategory[]
@@map("post")
}
model Category {
id Int @id @default(autoincrement())
name String
posts PostCategory[]
@@map("category")
}
model PostCategory {
categoryId Int @map("category_id")
postId Int @map("post_id")
category Category @relation(fields: [categoryId], references: [id])
post Post @relation(fields: [postId], references: [id])
@@id([categoryId, postId])
@@map("post_category")
}
我正在尝试创建一个同时包含多个类别的 post。如果存在类别,我想 connect
将该类别添加到 post。如果该类别不存在,我想创建它。创建部分运行良好,但连接部分有问题:
await prisma.post.create({
data: {
title: 'Hello',
categories: {
create: [{ category: { create: { name: 'News' } } }],
connect: {
categoryId_postId: { categoryId: 1, postId: ? }, // This doesn't work, even if I had the postId
},
},
},
});
如何使用现有的架构将现有类别连接到新的 post?
这里需要的是connectOrCreate
.
所以像这样的东西应该可以工作:
await prisma.post.create({
data: {
title: 'Hello',
categories: {
create: [
{
category: {
create: {
name: 'category-1',
},
},
},
{ category: { connect: { id: 10 } } },
],
},
},
});
您还可以在文档中阅读更多相关信息 here
这个问题让我感到困惑,所以我会在这里贡献我的解决方案,以防它能帮助别人。首先,阅读:https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations
我的架构与所讨论的架构相似,唯一的区别是我使用文件而不是帖子,使用标签而不是类别。为了 link 将创建的文件的标签添加到现有标签,我使用了这个:
await Promise.all(DEFAULT_FILES[2].map(file => prisma.file.create({
data: {
...file,
user_id: userId,
parent_id: homeFolder.id,
tags: {
create: file.tags?.map(name => ({
tag: {
connect: {
id: tags.find(t => t.name === name)?.id
}
}
}))
},
}
})))
await prisma.postCategory.create({
data: {
category: {
connectOrCreate: {
id: categoryId
}
},
posts: {
create: [
{
title: 'g3xxxxxxx',
body: 'body g3xxxxx'
}
],
},
},
})
您应该连接到现有记录,然后创建要与第一个记录关联的记录。
https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries(连接现有记录)
显式 many-to-many create/update 现有标签 read more here
let args =[1,2,3,4]
tags: {
create: args.tags?.map(tagId=>({
tag:{
connect:{
id:tagId
}
}
}))
},
}
在我的 Prisma 架构中,post 和类别之间存在多对多关系。我添加了 @map
选项来匹配 Postgres snake_case 命名约定:
model Post {
id Int @id @default(autoincrement())
title String
body String?
categories PostCategory[]
@@map("post")
}
model Category {
id Int @id @default(autoincrement())
name String
posts PostCategory[]
@@map("category")
}
model PostCategory {
categoryId Int @map("category_id")
postId Int @map("post_id")
category Category @relation(fields: [categoryId], references: [id])
post Post @relation(fields: [postId], references: [id])
@@id([categoryId, postId])
@@map("post_category")
}
我正在尝试创建一个同时包含多个类别的 post。如果存在类别,我想 connect
将该类别添加到 post。如果该类别不存在,我想创建它。创建部分运行良好,但连接部分有问题:
await prisma.post.create({
data: {
title: 'Hello',
categories: {
create: [{ category: { create: { name: 'News' } } }],
connect: {
categoryId_postId: { categoryId: 1, postId: ? }, // This doesn't work, even if I had the postId
},
},
},
});
如何使用现有的架构将现有类别连接到新的 post?
这里需要的是connectOrCreate
.
所以像这样的东西应该可以工作:
await prisma.post.create({
data: {
title: 'Hello',
categories: {
create: [
{
category: {
create: {
name: 'category-1',
},
},
},
{ category: { connect: { id: 10 } } },
],
},
},
});
您还可以在文档中阅读更多相关信息 here
这个问题让我感到困惑,所以我会在这里贡献我的解决方案,以防它能帮助别人。首先,阅读:https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations
我的架构与所讨论的架构相似,唯一的区别是我使用文件而不是帖子,使用标签而不是类别。为了 link 将创建的文件的标签添加到现有标签,我使用了这个:
await Promise.all(DEFAULT_FILES[2].map(file => prisma.file.create({
data: {
...file,
user_id: userId,
parent_id: homeFolder.id,
tags: {
create: file.tags?.map(name => ({
tag: {
connect: {
id: tags.find(t => t.name === name)?.id
}
}
}))
},
}
})))
await prisma.postCategory.create({
data: {
category: {
connectOrCreate: {
id: categoryId
}
},
posts: {
create: [
{
title: 'g3xxxxxxx',
body: 'body g3xxxxx'
}
],
},
},
})
您应该连接到现有记录,然后创建要与第一个记录关联的记录。
https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries(连接现有记录)
显式 many-to-many create/update 现有标签 read more here
let args =[1,2,3,4]
tags: {
create: args.tags?.map(tagId=>({
tag:{
connect:{
id:tagId
}
}
}))
},
}