Prisma 删除与复合键的多对多关系

Posted

技术标签:

【中文标题】Prisma 删除与复合键的多对多关系【英文标题】:Prisma delete many to many relationship with Composite Key 【发布时间】:2021-10-10 15:57:08 【问题描述】:

我在这里有这个架构:

model label 
  title         String          @id @db.VarChar(16)
  color         String          @db.VarChar(16)
  labelplaylist labelplaylist[]


model labelplaylist 
  playlistId Int
  labelId    String   @db.VarChar(16)
  label      label    @relation(fields: [labelId], references: [title])
  playlist   playlist @relation(fields: [playlistId], references: [id])

  @@id([playlistId, labelId])
  @@index([labelId], name: "labelId")


model playlist 
  id              Int             @id @default(autoincrement())
  createdAt       DateTime?       @default(now()) @db.DateTime(0)
  title           String          @db.VarChar(100)
  labelplaylist   labelplaylist[]

  @@index([userId], name: "userId")

我只想删除标签和播放列表之间的关系。我试过这样做:

const deleteRelation = await prisma.labelplaylist.delete(
    where: 
        playlistId_labelId: 
    ,
)

我有标签和播放列表表的主键,但我不知道如何获取主键 => playlistId_labelId。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

这是使用复合键查询的语法

    const deleteRelation = await prisma.labelplaylist.delete(
        where: 
            playlistId_labelId: 
                playlistId: playListIdVariable, //replace with appropriate variable
                labelId: labelIdVariable, //replace with appropriate variable
            ,
        ,
    );

您可以在 Prisma 文档中 CRUD Reference Guide 的 get record by Compound ID or Compound unique identifier 小节中阅读更多信息。此引用显示读取数据,但 where 条件对于删除和更新也是类似的。

【讨论】:

【参考方案2】:

由于是显式多对多关系,嵌套的deleteMany 只删除关系表记录,就像disconnect 一样。然后你可以write your query like that:

await req.db.playlist.update(
  data: 
    labels: 
      deleteMany: ,
    ,
  ,
  where: 
    id: labelId,
  ,
)

或者反过来。

它不会删除您的相关表记录,只会删除它们之间的链接。

【讨论】:

以上是关于Prisma 删除与复合键的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

没有复合键的休眠中的多对多

渴望加载 Laravel 5 与两个外键的多对多关系

如何删除与隐藏交集表的多对多关联中的记录?

Prisma 多对多关系查询

从 Prisma 中的多对多表中获取元信息

删除 NSManagedObject 子类不会取消它的多对多关系