Prisma 删除与 Composite Key 的多对多关系

Prisma delete many to many relationship with Composite Key

我这里有这个模式:

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

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

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

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

感谢您的帮助。

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

    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 通过复合 ID 或复合唯一标识符获取记录 小节中阅读更多内容。此参考显示读取数据,但 where 条件与删除和更新类似。

因为它是一个 显式 多对多关系,嵌套 deleteMany 只删除关系 table 记录,就像 disconnect .然后你可以 write your query like that:

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

或相反。

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