【问题标题】:How to delete a record with all relevant records in prisma如何在 prisma 中删除包含所有相关记录的记录
【发布时间】:2019-06-27 07:54:18
【问题描述】:

我知道the documentation of prisma-client中有一些与我的问题相关的部分:

但是,我不明白如何在 (JavaScript) prisma-client 中删除一条记录及其所有相关记录。

例如,我的datamodel 是这样的:

type Board {
  id: ID! @unique
  createdAt: DateTime!
  updatedAt: DateTime!
  owner: User! @relation(name: "BoardOwnershipRelation")
  title: String!
  description: String
  taskGroups: [TaskGroup!]!
}

type TaskGroup {
  id: ID! @unique
  createdAt: DateTime!
  updatedAt: DateTime!
  owner: User! @relation(name: "TaskGroupOwnershipRelation")
  board: Board!
  title: String!
  description: String
  precedence: Int
  tasks: [Task!]!
}

type Task {
  id: ID! @unique
  createdAt: DateTime!
  updatedAt: DateTime!
  owner: User! @relation(name: "TaskOwnershipRelation")
  taskGroup: TaskGroup!
  title: String!
  description: String
  dueDate: DateTime
  precedence: Int
  items: [TaskItem!]!
  assignedTo: [User!]! @relation(name: "AssignmentRelation")
}

type TaskItem {
  id: ID! @unique
  createdAt: DateTime!
  updatedAt: DateTime!
  owner: User! @relation(name: "TaskItemOwnershipRelation")
  task: Task!
  title: String!
  description: String
  checked: Boolean!
  precedence: Int
}

如何删除所有相关的任务组、任务和任务项的董事会?!

编辑

我最近尝试了这个解决方案,效果也很好。

// e.g. this is in my GraphQL resolvers async function...

await prisma.deleteManyTaskItems({
  task: {
    taskGroup: {
      board: {
        id: boardId
      }
    }
  }
});

await prisma.deleteManyTasks({
  taskGroup: {
    board: {
      id: boardId
    }
  }
});

await prisma.deleteManyTaskGroups({
  board: {
    id: boardId
  }
});

return await prisma.deleteBoard({ id: boardId });

但是,我的问题有没有更好的解决方案???

【问题讨论】:

    标签: prisma


    【解决方案1】:

    您可以使用@relation 指令的“onDelete”参数来指定删除实体时会发生什么 (documentation)

    你只需要像这样改变你的数据模型:

    type Board {
      id: ID! @unique
      createdAt: DateTime!
      updatedAt: DateTime!
      owner: User! @relation(name: "BoardOwnershipRelation")
      title: String!
      description: String
      taskGroups: [TaskGroup!]! @relation(name: "BoardTaskGroups" onDelete: CASCADE)
    }
    
    type TaskGroup {
      id: ID! @unique
      createdAt: DateTime!
      updatedAt: DateTime!
      owner: User! @relation(name: "TaskGroupOwnershipRelation")
      board: Board! @relation(name: "BoardTaskGroups")
      title: String!
      description: String
      precedence: Int
      tasks: [Task!]! @relation(name: "TaskGroupsTask" onDelete: CASCADE)
    }
    
    type Task {
      id: ID! @unique
      createdAt: DateTime!
      updatedAt: DateTime!
      owner: User! @relation(name: "TaskOwnershipRelation")
      taskGroup: TaskGroup! @relation(name: "TaskGroupsTask")
      title: String!
      description: String
      dueDate: DateTime
      precedence: Int
      items: [TaskItem!]! @relation(name: "TaskTaskItem" onDelete: CASCADE)
      assignedTo: [User!]! @relation(name: "AssignmentRelation")
    }
    
    type TaskItem {
      id: ID! @unique
      createdAt: DateTime!
      updatedAt: DateTime!
      owner: User! @relation(name: "TaskItemOwnershipRelation")
      task: Task! @relation(name: "TaskTaskItem")
      title: String!
      description: String
      checked: Boolean!
      precedence: Int
    }
    

    然后删除您的董事会。所有其他删除将由 Prisma 完成

    【讨论】:

      猜你喜欢
      • 2019-08-26
      • 2016-02-19
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 2023-03-26
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多