如果您只是想级联删除,则客户端无需执行任何操作 - 无需特殊查询。只需在突变解析器中执行适当的逻辑即可。
例如如果您有一个用于删除突变解析器最终将调用的用户的服务方法(示例是 Java,但无论您使用哪种语言(您没有提到),逻辑都是相同的):
boolean deleteUser(String id) {
// either do the assignment deletion yourself here (not good)
// or set your database to cascade the deletions (preferable)
dataBase.execute("DELETE FROM User WHERE id = :id");
return true; //have to return *something*
}
客户端不需要关心这个,他们只是告诉你的系统删除用户:
mutation deleteUser($userId: ID!){
deleteUser(id: $userId)
}
如果您希望客户端能够获得比布尔成功标志更好的东西,请返回该东西(这当然意味着相应地更改架构):
String deleteUser(String id) {
dataBase.execute("DELETE FROM User WHERE id = :id");
//return the e.g. the ID
return id;
}
或
String deleteUser(String id) {
User user = dataBase.execute("SELECT FROM User WHERE id = :id");
dataBase.execute("DELETE FROM User WHERE id = :id");
//return the whole deleted user
return user;
}
后者使客户端能够查询结果(这些是子查询,不是子突变,没有子突变之类的东西):
mutation deleteUser($userId: ID!){
deleteUser(id: $userId) {
id
assignments {
id
}
}
}
需要注意的是,与查询不同,突变不能嵌套,但是是的,您可以发送多个顶级突变(如您的示例中所示)。不幸的是,没有办法将第一个的结果用作第二个的输入。有人要求在 GraphQL 规范中引入这一点,但它可能会发生,也可能不会发生。
意思是你的例子:
mutation deleteUser($userId: ID!) {
deleteUser(id: $userId) {
id
assignment {
id # use that id somehow below
}
} {
deleteAssignment(id: id_from_above) {
id
}
}
很遗憾,这是不可能的。
您必须以两个单独的请求 的方式执行此操作,或者提出更精细的方法。如果您需要允许客户端进行更深层次的控制,您可以做的是接受更复杂的输入,而不仅仅是 ID,例如:
input DeleteUserInput {
id: ID!
deleteOwnAssignments: Boolean
deleteManagedAssignments: Boolean
}
mutation deleteUser($input: DeleteUserInput!) {
deleteUser(input: $input)
}
boolean deleteUser(String id, boolean deleteOwnAssignments, boolean deleteManagedAssignments) {
if (deleteOwnAssignments) {
dataBase.execute("DELETE FROM Assignment WHERE assigned_to = :id");
}
if (deleteManagedAssignments) {
dataBase.execute("DELETE FROM Assignment WHERE manager_id = :id");
}
dataBase.execute("DELETE FROM User WHERE id = :id");
return true; //or return whatever is appropriate
}