首页 > 解决方案 > 在 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

所以在这里,将创建一个单独的类型。这种类型将告诉用户应该做什么操作(如果应该做的话)。在这里,我们消除了为特定组加载整个用户列表的问题。因此,如果我们想删除单个用户,我们只需定义operationasDELETE并将用户 ID 添加到users. 如果我们想删除所有用户,我们users留空,并设置DELETE_ALL为操作值。

太好了……回到问题。关于上述主题的最佳实践是什么?我们应该创建许多更简单的字段,还是使用其他提供的方法更好?

标签: graphql

解决方案


推荐阅读