我很好奇处理大部分图形可能受到影响的突变的“正确”方法。最好的例子是删除“父”节点导致删除一堆它的孩子。现有的突变配置(FIELDS_CHANGED、NODE_DELETE 等)对于相对简单的操作来说已经足够了,但我不确定处理更复杂的事情的正确方法。
一个具体的例子会有所帮助。假设我们正在开发经典的 Relay 示例应用程序,并且正在使用三种特定类型:Ship
、Faction
和User
。让我们假设Ships
属于一个Faction
(多对一)并且Users
有一个favorite_ships
连接(多对多)。伪模式可能是这样的:
galaxy {
ships
factions { ships }
users { favorite_ships }
}
好吧,酷。我们有一个Faction
名为“帝国”的船,它的连接中有一堆船,如“领带战斗机”、“星际驱逐舰”等。然后我们有一个User
最喜欢的船只,其中包括“领带战斗机”通过favorite_ships
连接。
到目前为止一切都很好。现在一些朋克出现并Faction
通过DestroyFactionMutation
. 所述突变的输入相当简单:Faction
id,但突变对后端的影响很大:
- 给定
Faction
节点被删除 - 所有关联的
Ship
节点也被删除 - 所有关联的
User { favorite_ship }
条目也被删除
因此,我的问题是:如何编写突变有效负载、胖查询和突变配置以使用 Relay 对其进行建模?
想了一会儿,我想大概是这样的:
type DestroyFactionMutationPayload {
clientMutationId: String!
user: User
destroyedFactionId: String
affectedUserIds: [String]
destroyedShipIds: [String]
}
然后客户端会像这样更新:
- 添加一个 NODE_DELETE 配置以删除与
Faction
对应的节点destroyedFactionId
,这是有据可查且直截了当的 - 添加一个 NODE_DELETE 配置以删除与该配置相对应的节点
Ship
,destroyedShipIds
但使用什么parentID
?您是否需要为每个affectedUserIds
. - 如果 #2 不是真的那样工作,也许你可以添加一个 FIELDS_CHANGE 配置,指定
user { favorite_ships }
可以改变,给定affectedUserIds
(也可能通过 REQUIRED_CHILDREN 获取?)
抱歉,如果这是漫无边际且不清楚;希望这种“类型”的突变对于使用 Relay 时间较长的人来说是熟悉的。我可以尝试这些选项,但我想要一些关于这种事情的“最佳”方法的建议。谢谢!