graphql - 在 GraphQL 中编写突变字段的最佳实践
问题描述
让我们假设,我有这个模型结构:
User {
id: int
group: UserGroup
}
UserGroup {
id: int
name: string
users: User[]
}
我希望有可能执行这些操作:
- 创建用户组
- 编辑组数据
- 将用户添加到组
- 从组中删除用户
- 从组中删除所有用户
我想问的是:在 GraphQL 中为此类操作创建字段的最佳实践是什么?我正在考虑一些可能的选项(也许还有其他选项):
1.许多更简单的领域
在这里,将添加许多字段。一个字段引用了上面提到的单个操作。所以这个比较简单。
createGroup(groupId: Int!, name: String!, users: Array<User>): Group
editGroup(groupId: Int!, name: String, users: Array<User>): Group
addUserToGroup(groupId: Int!, user: User!): Group
removeUserFromGroup(groupId: Int!, userId: Int!): Group
removeAllUsersFromGroup(groupId: Int!): Group
2. 资源领域
在这里,字段引用模型资源。因此,对于我们的示例,应该只有其中两个:
createGroup(groupId: Int!, name: String!, users: Array<User>): Group
editGroup(groupId: Int!, name: String, users: Array<User>): Group
但在editGroup
节点的情况下,用户列表总是被覆盖。所以在前端代码中,总是“必须”拥有完整的用户列表。我们都应该知道,这可能有点难以实施。尤其是当列表包含许多项目或在系统的特定部分没有整个列表时。
3.资源字段和操作自定义类型
UsersMutationType {
operation: (ADD|DELETE|DELETE_ALL)!,
users: Array<int>!
}
createGroup(groupId: Int!, name: String!, users: Array<User>): Group
editGroup(groupId: Int!, name: String, users: UsersMutationType): Group
所以在这里,将创建一个单独的类型。这种类型将告诉用户应该做什么操作(如果应该做的话)。在这里,我们消除了为特定组加载整个用户列表的问题。因此,如果我们想删除单个用户,我们只需定义operation
asDELETE
并将用户 ID 添加到users
. 如果我们想删除所有用户,我们users
留空,并设置DELETE_ALL
为操作值。
太好了……回到问题。关于上述主题的最佳实践是什么?我们应该创建许多更简单的字段,还是使用其他提供的方法更好?
解决方案
推荐阅读
- string - 如何在 UNIX 中只转义文本中间的双引号?
- javascript - 更改 JS 中子 SVG 元素的属性
- ruby-on-rails - Airbnb 如何发送每篇文章?
- php - 如何在 Laravel 中使用数组访问数据库值
- javascript - RxJS 什么是镜像?
- asp.net-mvc-5 - Asp.Net MVC ValidationSummary HTML 错误信息
- python - 扩展 pyspark 的 DataFrame 类
- powershell - 如何在特定时间杀死一个进程并在 x 分钟后重新启动它?
- vba - 每个请求所需的 3% 数据
- docker - 程序集引用更改后,如何保持 Azure Functions v2 运行时在容器中运行?