1

我很好奇处理大部分图形可能受到影响的突变的“正确”方法。最好的例子是删除“父”节点导致删除一堆它的孩子。现有的突变配置(FIELDS_CHANGED、NODE_DELETE 等)对于相对简单的操作来说已经足够了,但我不确定处理更复杂的事情的正确方法。

一个具体的例子会有所帮助。假设我们正在开发经典的 Relay 示例应用程序,并且正在使用三种特定类型:ShipFactionUser。让我们假设Ships属于一个Faction(多对一)并且Users有一个favorite_ships连接(多对多)。伪模式可能是这样的:

galaxy {
  ships
  factions { ships }
  users { favorite_ships }
}

好吧,酷。我们有一个Faction名为“帝国”的船,它的连接中有一堆船,如“领带战斗机”、“星际驱逐舰”等。然后我们有一个User最喜欢的船只,其中包括“领带战斗机”通过favorite_ships连接。

到目前为止一切都很好。现在一些朋克出现并Faction通过DestroyFactionMutation. 所述突变的输入相当简单:Factionid,但突变对后端的影响很大:

  1. 给定Faction节点被删除
  2. 所有关联的Ship节点也被删除
  3. 所有关联的User { favorite_ship }条目也被删除

因此,我的问题是:如何编写突变有效负载、胖查询和突变配置以使用 Relay 对其进行建模?

想了一会儿,我想大概是这样的:

type DestroyFactionMutationPayload {
  clientMutationId: String!
  user: User
  destroyedFactionId: String
  affectedUserIds: [String]
  destroyedShipIds: [String]
}

然后客户端会像这样更新:

  1. 添加一个 NODE_DELETE 配置以删除与Faction对应的节点destroyedFactionId,这是有据可查且直截了当的
  2. 添加一个 NODE_DELETE 配置以删除与该配置相对应的节点ShipdestroyedShipIds但使用什么parentID?您是否需要为每个affectedUserIds.
  3. 如果 #2 不是真的那样工作,也许你可以添加一个 FIELDS_CHANGE 配置,指定user { favorite_ships }可以改变,给定affectedUserIds(也可能通过 REQUIRED_CHILDREN 获取?)

抱歉,如果这是漫无边际且不清楚;希望这种“类型”的突变对于使用 Relay 时间较长的人来说是熟悉的。我可以尝试这些选项,但我想要一些关于这种事情的“最佳”方法的建议。谢谢!

4

0 回答 0