如何使用 GraphQL 突变进行更新(热巧克力)

Posted

技术标签:

【中文标题】如何使用 GraphQL 突变进行更新(热巧克力)【英文标题】:How to do updates with GraphQL mutations(Hot Chocolate) 【发布时间】:2022-01-10 13:47:30 【问题描述】:

我们最近在我们的项目中引入了 GraphQL,我以前从未使用过它,但是我非常喜欢它。 我们决定为 .NET Core 使用 HotChocolate 库,为客户端使用 Apollo。

我不太确定的一件事是关于突变,特别是通过突变执行更新和部分更新。 我在某处读到这种做法,我应该坚持为每个更新创建特定的突变,例如 updateUsername()、updateAddress()、updateCity(),它们都应该有特定的突变。 p>

问题是,如果我决定朝这个方向发展,我的代码库将会大幅增长,因为我们非常依赖数据,每个表有很多表和列。

另一个问题是,如何处理可为空的属性,我可以创建一个接受某些输入对象的突变,但最终我的实体将被覆盖,并且调用端未提供的所有可为空的属性都将设置为 null . 有没有办法部分处理这个更新,或者我应该为我想要更新的每个属性使用特定的更新突变?

【问题讨论】:

【参考方案1】:

我认为您错误地理解了围绕特定突变的最佳实践。它不是“有一个突变来更新一个字段”,而是更多的是“有特定的突变来封装你的域中的动作”。一个具体的例子是创建一个“addItemToBasket”突变,而不是有 3 个突变来更新与您的购物篮相关的各个表等。

GraphQL 非常以前端开发为中心,因此您的变更通常应该与用户可以在您的前端执行的操作非常相似。例如。您的前端有一个“添加到购物篮”按钮,而您的后端有一个“addItemToBasket”突变,类似于将商品放入用户购物篮的操作。

如果您在设计突变时考虑到这一点,大多数时候您不应该遇到部分更新的问题,因为突变确切地知道要做什么,而且您不只是让架构的用户更新字段随意。

如果出于某种原因您需要进行这些部分更新,除非您的数据提供者支持,否则您可能无法自行实施修补程序。这意味着您必须拥有一个具有可为空属性的输入对象类型,以及决定哪些字段已更改并使用您的数据提供程序更改它们的突变。

话虽如此,Hot Chocolate 存储库中还有一个修补类型的建议,应该可以简化修补部分:https://github.com/ChilliCream/hotchocolate/issues/1326

【讨论】:

好的,如此清晰地定义了类似于特定用户操作的以域为中心的突变。是的,我听错了。谢谢

以上是关于如何使用 GraphQL 突变进行更新(热巧克力)的主要内容,如果未能解决你的问题,请参考以下文章

应该如何对列表中的项目进行重新排序,并更新多个对象,如何使用 GraphQL 突变进行持久化?

Sequelize with GraphQl:如何使用突变更新字段

如何在 Apollo / GraphQL 发生突变后更新缓存?

如何在 GraphQL 中执行突变?

FaunaDB - 如何批量更新单个 graphQL 突变中的条目列表?

如何在没有参数的情况下进行graphql突变? (Vue 阿波罗)