typescript Prisma多对多关系:创建并连接

7lrncoxx  于 2022-12-14  发布在  TypeScript
关注(0)|答案(5)|浏览(290)

在我的Prisma模式中,帖子和类别之间存在多对多的关系。我添加了@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")
}

我正在尝试创建一个同时包含多个类别的帖子。如果类别存在,我想将该类别connect到帖子中。如果类别不存在,我想创建它。创建部分工作正常,但连接部分有问题:

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

如何将现有类别连接到具有我所拥有的架构的新帖子?

dvtswwa3

dvtswwa31#

这里需要的是connectOrCreate
因此,应该可以这样做:

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

您还可以在此处的文档中阅读更多相关信息

mlnl4t2r

mlnl4t2r2#

这个问题把我逼上了绝路,所以我在这里提出我的解决方案,以防它对其他人有帮助。首先,阅读以下内容:https://www.prisma.io/docs/concepts/components/prisma-schema/relations/many-to-many-relations
我的模式与上面讨论的模式类似,唯一的区别是我用Files代替了Posts,用Tags代替了Categories。为了将创建的文件的标签链接到现有的标签,我使用了以下代码:

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
            }
          }
        }))
      },
    }
  })))
3duebb1j

3duebb1j3#

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(连接现有记录)

3pmvbmvn

3pmvbmvn4#

显式多对多创建/更新现有标签在此阅读更多

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

ohfgkhjo5#

经过几个小时的尝试,我终于为我的用例想出了下面的解决方案。
第一个

相关问题