Prisma.js - 如何插入具有多对多关系的表

问题描述 投票:0回答:4

如何使用 Prisma.js 为帖子分配一些标签?

我已经有一些标签,我想为帖子分配一些标签? 我不想创建新标签。

schema.prisma:

model Post {
  Id                 String           @id @default(uuid())
  AuthorId           String
  Author             User             @relation(fields: [AuthorId], references: [Id])
  CategoryId         String?
  Category           Category?        @relation(fields: [CategoryId], references: [Id])
  Title              String           @db.VarChar(255)
  Description        String?          @db.MediumText
  Summary            String?          @db.VarChar(255)

  Tags               TagPostMapping[]
}

model TagPostMapping {
  Id           String     @id @default(uuid())
  Post         Post?      @relation(fields: [PostId], references: [Id])
  PostId       String?
  Tag          Tag?       @relation(fields: [TagId], references: [Id])
  TagId        String?
  CreatedDate  DateTime   @default(now())
  ModifiedDate DateTime?  @updatedAt
}

model Tag {
  Id             String           @id @default(uuid())
  Title          String           @unique
  Posts          TagPostMapping[]
  CreatedDate    DateTime         @default(now())
  ModifiedDate   DateTime?        @updatedAt
}

在Prisma网站上有一个示例,但它适合创建一些标签并将它们分配给帖子。 虽然我想在文章中添加一些现有的标签。

https://www.prisma.io/docs/support/help-articles/working-with-many-to-many-relations#explicit-relations

node.js database orm prisma prisma2
4个回答
1
投票

我也遇到过类似的情况,下面的代码对我有用:

  addTagToPost(addTagDto: AddTagDto): Promise<TagDto> {
    return prisma.tag.update({
      where: { Id: addTagDto.tagId },
      data: {
        Posts: {
          create: [
            {
              Post: {
                connect: {
                  Id: addTagDto.postId,
                },
              },
            },
          ],
        },
      },
    });
  }

PS:由于

Post
Tag
是多对多的关系,所以你也可以更新
prisma.post.update


0
投票

我通过使用 connectOrCreate 和 prisma v4 解决了这个问题。有了它,您可以连接/分配数据库中已存在的标签,而无需创建新标签。使用 connectOrCreate 的优点。如果数据库中不存在该标签,它可以创建一个新标签。该代码适用于您的 prisma 架构。

await prisma.post.create({
      data: {
          tags: {
            create: [
              { 
                tag: 
                { 
                  connectOrCreate: 
                  { 
                     where: {
                      name: 'dev' 
                     },
                     create: {
                      name: 'dev'
                    },
                  } 
                } 
              },
            ],
          },

更新查询棱镜:

await prisma.post.update({
    where: {
        id: "idpost"
      },
      data: {
       ...
       //same with code above
      }

参考:


0
投票

我也有同样的问题。但上面的这些解决方案对我不起作用。因为当我创建帖子时,我没有

postId
,也没有
tagId
。还有其他解决办法吗?


-3
投票

我使用了

$transaction
,在这个事务中我创建了2个插入命令,我还使用uuid包定义了一个用于发布的ID。
postId = v4()
v4()
uuid
中的函数,可生成唯一的
Id

  public async Create(post: IPost): Promise<Post> {

    let postId = v4();
    let postTagIds: postTagMapping[] = [];
    post.Tags?.map(tag => postTagIds.push({ PostId: postId, TagId: tag.Id }));

    const transResult = await ApplicationDbContext.Prisma.$transaction([
      ApplicationDbContext.Prisma.post.create({
        data: {
          Id: postId,
          Title: post.Title,
          Summary: post.Summary,
          Description: post.Description,
          IsActive: post.IsActive,
          IsPublished: post.IsPublished,
          IsActiveNewComment: post.IsActiveNewComment,
          AuthorId: post.AuthorId,
          CategoryId: post.CategoryId,
        },
      }),
      ApplicationDbContext.Prisma.tagPostMapping.createMany({
        data: postTagIds
      })

    ]).finally(async () => {
      await ApplicationDbContext.Prisma.$disconnect();
    });

    let result = transResult as unknown as Post;

    return result;
  }
© www.soinside.com 2019 - 2024. All rights reserved.