postgresql Prisma Explicit Many to Many -如何在不删除用户的情况下删除项目

4sup72z8  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(148)

我的使用案例很简单:

  • 有用户
  • 用户可以创建工作区
  • 用户可以删除工作区
  • 用户在每个工作区中获得一个角色(OWNERADMINMANAGERVIEWER
    问题:

这需要一个显式many-to-many关系(users <->workspaces)。
创建工作区是很好的,它可以工作。删除工作区是问题发生的地方。它可能:

  • 不删除任何内容
  • 或者使用onDelete: Cascade删除所有内容(user + workspace + their relation table row
    我显然不希望我的用户被删除。

下面是我的Prisma模式:

model User {
  id                 String              @id @default(cuid())
  createdAt          DateTime            @default(now())
  updatedAt          DateTime            @updatedAt
  email              String?             @unique
  plan               Plan?               @relation(fields: [planId], references: [id], onDelete: Cascade)
  planId             String?
  workspaces         WorkspacesOnUsers[]
}

model Workspace {
  id           String              @id @default(cuid())
  createdAt    DateTime            @default(now())
  updatedAt    DateTime            @updatedAt
  name         String?
  users        WorkspacesOnUsers[]
}

model WorkspacesOnUsers {
  id          String     @id @default(cuid())
  user        User?      @relation(fields: [userId], references: [id], onDelete: Restrict, onUpdate: Restrict)
  userId      String?
  workspace   Workspace? @relation(fields: [workspaceId], references: [id])
  workspaceId String?
  role        Role?      @default(VIEWER)
}

enum Role {
  OWNER
  ADMIN
  MANAGER
  VIEWER
}

这就是我尝试从用户删除工作区的方法:

await prisma.workspace.delete({
  where: { id: workspaceId },
})

我也尝试了这个方法,但它只删除了关系中的行,但在此之后我仍然无法删除工作空间(Foreign key constraint failed on the field: WorkspacesOnUsers_userId_fkey (index)):

await prisma.workspace.update({
    where: { id: workspaceId },
    data: {
      users: { deleteMany: {} },
    },
  })

来人啊!

lvmkulzt

lvmkulzt1#

我有一个类似的问题,但与用户删除职位,这是我如何删除一个职位附加到一个用户通过有id(在这种情况下,他们的sessionId)

await prisma.user.update({
    where: { sessionId: sessionId },
    data: {
        Post: {
            delete: {
                id: postId,
            },
        },
    },
});

在您情况下,它将类似于以下内容

await prisma.user.update({
    where: { id: userIdFromFunction },
    data: {
        Workspace: {
            delete: {
                id: workspaceIdFromFunction,
            },
        },
    },
});

希望这对你有帮助!

相关问题