Velvet Star Monitor

Standout celebrity highlights with iconic style.

news

Prisma many-to-many relations: create and connect

Writer Sophia Terry

In my Prisma schema, I have a many-to-many relationship between posts and categories. I've added @map options to match the Postgres snake_case naming convention:

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")
}

I'm trying to create a post with multiple categories at the same time. If a category exists, I'd like to connect the category to the post. If the category doesn't exist, I'd like to create it. The creation part is working well, but the connection part is problematic:

 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 }, }, }, });

How can I connect an existing category to a new post with the schema that I have?

4 Answers

What you need here is connectOrCreate.

So something like this should work:

 await prisma.post.create({ data: { title: 'Hello', categories: { create: [ { category: { create: { name: 'category-1', }, }, }, { category: { connect: { id: 10 } } }, ], }, }, });

You can also read more about this in the docs here

4

This problem drove me up the wall so I'll contribute my solution here incase it helps someone else. First, read this:

My schema is similar to the one in question, only difference is I have Files instead of Posts and Tags instead of Categories. To link the created file's tags to existing tags I used this:

 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' } ], }, },
})

You should connect to the existing record and then create the record that you want to be related with the first one.

(Connect an existing record)

Explicit many-to-many create/update existing tags read more here

let args =[1,2,3,4]
tags: { create: args.tags?.map(tagId=>({ tag:{ connect:{ id:tagId } } })) }, }

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy