首页 文章

GraphQL级联删除

提问于
浏览
0

我正在使用GraphQL,并希望从数据库和其他实体中删除实体,该实体按关系分配给第一个实体 .

假设我在GraphQL Schema中有三种类型

  • 用户

  • 作业

  • 任务

逻辑如下: User 以某种方式与 Task 相关 . 此关系由"intermediate" object Assignment 表示 . (在 Assignment 我可以设置用户是任务或工作人员的主管或者其他任何东西,这不是重点 . )

现在,我想删除 User 和相关的 Assignment (不应删除 Task ) .

我想知道我是否可以通过只执行一个只有一个参数的突变查询来做到这一点:用户ID?

我想的是:

mutation deleteUser($userId: ID!){
  deleteUser(id: $userId){
    id
    assignment {
      id # use that id somehow below
    }
  } {
    deleteAssignment(id: id_from_above) {
    }
  }
}

有可能这样吗?

1 回答

  • 1

    我想你会从阅读Mutation section of the GraphQL spec中受益 .

    如果操作是突变,则操作的结果是在突变根对象类型上执行突变的顶级选择集的结果 . 该选择集应该连续执行 .

    这里的关键点是突变是:

    • 被认为是一种查询,除了它们有副作用

    • 它们不是以方便或甚至同时的顺序完成的 - 比如查询 - 但按顺序完成

    要具体说明您的问题:如果删除用户需要在概念上也删除该用户的分配,并删除分配删除所有任务,那么暴露的变异(即“查询”)可能只是:

    mutation deleteUser($userId: ID!) {
      deleteUser(id: $userId)
    }
    

    并且相关的删除恰好发生,并且不需要返回任何内容 . 如果您确实想要返回内容,可以添加可供查看的内容:

    mutation deleteUser($userId: ID!) {
      deleteUser(id: $userId) {
        assignment {
          task
        }
      }
    }
    

    或者,如果您希望删除由客户端控制的分配和任务,以便“查看”子删除(触发此类实际删除:

    mutation deleteUser($userId: ID!) {
      deleteUser(id: $userId) {
        deleteAssignment {
          deleteTask
        }
      }
    }
    

    当然假设您适当地定义Mutation类型以使这些字段可用,并且底层软件相应地采取上述所需行为 .

相关问题