通过Relay

时间:2015-12-23 03:18:42

标签: relayjs graphql

我很好奇处理突变的“正确”方法,其中大部分图表都会受到影响。最好的例子是删除一个“父”节点,导致删除一堆子节点。现有的变异配置(FIELDS_CHANGED,NODE_DELETE等)足以进行相对简单的操作,但我不确定处理更复杂事情的正确方法。

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

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

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

到目前为止一切顺利。现在有些朋克出现并通过Faction摧毁了整个“帝国”DestroyFactionMutation。所述突变的输入非常简单:Faction id,但突变对后端的影响很大:

  1. 删除了给定的Faction节点
  2. 所有关联的Ship节点也将被删除
  3. 所有关联的User { favorite_ship }条目也将被删除
  4. 因此,我的问题是:如何使用Relay编写变异有效负载,胖查询和变异配置?

    在考虑了一下后,我想可能是这样的:

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

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

    1. 添加NODE_DELETE配置以删除与Faction对应的destroyedFactionId节点,该节点已有详细记录且直截了当
    2. 添加NODE_DELETE配置以删除与Ship配置对应的destroyedShipIds个节点,但使用 {/ 1>}的?您是否需要为每个parentID生成一个NODE_DELETE,如果是,那么如何获取这些ID以便它们位于变异道具中... REQUIRED_CHILDREN?
    3. 如果#2不是那样真的那样,也许你可以添加一个FIELDS_CHANGE配置,指定affectedUserIds可以改变,给定user { favorite_ships }(也可能通过REQUIRED_CHILDREN获取?)
    4. 对不起,如果这是漫无目的,不清楚;希望这种“类型”的突变对于已经使用Relay一段时间的人来说是熟悉的。我可以尝试这些选项,但我想对这样的“最佳”方法提出一些建议。谢谢!

0 个答案:

没有答案