如何在 GraphQL 中级联删除?

Paw*_*wel 5 graphql

我正在使用 GraphQL,想要从数据库中删除一个实体以及通过关系分配给第一个实体的另一个实体。

假设我的架构中有三种类型:

  1. 用户
  2. 任务
  3. 任务

逻辑如下:User与 a 有某种关系Task。这种关系由“中间”对象来表达Assignment。(Assignment我可以设置用户是任务或工作人员或任何其他东西的主管,这并不重要。)

现在,我要删除User和相关的AssignmentTask不应该删除的)。

我可以在仅使用一个参数(用户 ID)执行一个突变查询时执行此操作吗?

我在想这样的事情:

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

这样的事情可能吗?

Ed.*_*Ed. 3

我认为您将从阅读GraphQL 规范的 Mutation 部分中受益。

\n
\n

如果操作是突变,则操作的结果是在突变根对象类型上执行mutation\xe2\x80\x99s顶级选择集的结果。该选择集应串行执行。

\n
\n

这里的关键点是突变是:

\n
    \n
  • 被认为是一种查询,但它们有副作用
  • \n
  • 它们不是按照方便的顺序完成的,甚至不是像查询一样同时完成的,而是按顺序完成的
  • \n
\n

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

\n
mutation deleteUser($userId: ID!) {\n  deleteUser(id: $userId)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

并且相关的删除就会发生,并且不需要返回任何内容。如果您确实想退回物品,您可以将这些物品添加为可供查看:

\n
mutation deleteUser($userId: ID!) {\n  deleteUser(id: $userId) {\n    assignment {\n      task\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

或者,如果您希望由客户端控制分配和任务的删除,以便“查看”子删除(这会触发此类实际删除 - 这些将是改变数据的查询,因此从设计上来说是有问题的)观点看法):

\n
mutation deleteUser($userId: ID!) {\n  deleteUser(id: $userId) {\n    deleteAssignment {\n      deleteTask\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

当然,假设您适当地定义了该 Mutation 字段的返回类型以使这些字段可用,并且底层软件按照上述所需的行为进行相应的操作。

\n