graphql - 如何构建我的 graphql 模式以允许检索可能的下拉值?

标签 graphql

我正在尝试从我的 graphQL api 获取多个下拉菜单的可能值。

例如,假设我有这样的架构:

type Employee {
  id: ID!
  name: String!
  jobRole: Lookup!
  address: Address!
}

type Address {
  street: String!
  line2: String
  city: String!
  state: Lookup!
  country: Lookup!
  zip: String!
}

type Lookup {
  id: ID!
  value: String!
}

职位 , 城市状态 是所有具有预先确定的值列表的字段,这些值在应用程序周围表单的各种下拉列表中需要。

在这种情况下,模式设计的最佳实践是什么?我正在考虑以下选项:
query {
  lookups {
    jobRoles {
      id
      value
    }
  }
}

这具有数据驱动的优势,因此我可以更新我的工作角色而无需更新我的架构,但我可以看到这变得很麻烦。我只添加了一些业务对象,并且在我的模式中已经有大约 25 种不同类型的查找,当我向 API 添加更多数据时,我需要以某种方式维护用于正确字段的正确查找,处理在多个地方使用的一般查找与仅适用于一个字段的超特定查找等。

有没有其他人遇到过类似的问题,是否有一个好的设计模式来处理这个问题?

为了记录,我不想使用带有自省(introspection)的枚举有两个原因。
  • 随着我们在现有数据中的查找次数增多,将需要非常频繁的模式更新
  • 使用枚举只能得到一个值,我需要一个将用作数据库中的主键的代码和一个将显示在 UI 中的描述性值。
  • //bad
    enum jobRole {
      MANAGER
      ENGINEER
      SALES
    }
    //needed
    [
      {
        id: 1,
        value: "Manager"
      },
      {
        id: 2,
        value: "Engineer"
      },
      {
        id: 3,
        value: "Sales"
      }
    ]
    

    编辑
    我想再举一个例子说明为什么枚举可能不起作用。我们有很多描述应该显示在包含特殊字符的下拉列表中。
    // Client Type
    [
      {
        id: 'ENDOW',
        value: 'Foundation/Endowment'
      },
      {
        id: 'PUBLIC',
        value: 'Public (Government)'
      },
      {
        id: 'MULTI',
        value: 'Union/Multi-Employer'
      }
    ]
    

    还有一些更糟糕,它们有 <、>、% 等。其中一些是完整的句子,因此枚举的限制性命名确实不适用于这种情况。我倾向于只做一堆查找查询并将每个查找视为一个不同的业务对象

    最佳答案

    我找到了一种让枚举按我需要的方式工作的方法。我可以通过将其放入 description 中来获取该值

    这是我的 gql 架构定义

    enum ClientType {
        """
        Public (Government)
        """
        PUBLIC
        """
        Union/Multi-Employer
        """
        MULTI
        """
        Foundation/Endowment
        """
        ENDOW
    }
    

    当我用这样的自省(introspection)查询检索它时
    {
      __type(name: "ClientType") {
        enumValues {
          name
          description
        }
      }
    }
    

    我以我正在寻找的确切结构获得我的数据!
    {
        "data": {
            "__type": {
                "enumValues": [{
                    "name": "PUBLIC",
                    "description": "Public (Government)"
                }, {
                    "name": "MULTI",
                    "description": "Union/Multi-Employer"
                }, {
                    "name": "ENDOW",
                    "description": "Foundation/Endowment"
                }]
            }
        }
    }
    

    这正是我需要的。我可以使用我们描述中的所有特殊字符、数字等。如果有人想知道如何使我的架构与我们的数据库保持同步,我有一个简单的代码生成脚本,它查询存储此信息的表并生成一个导出所有这些枚举的 enums.ts 文件。每当数据更新时(这种情况并不经常发生),我只需重新运行代码生成器并将架构更改发布到生产环境。

    关于graphql - 如何构建我的 graphql 模式以允许检索可能的下拉值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57517157/

    相关文章:

    graphql - FaunaDB GraphQL API 返回 "Invalid database secret"

    graphql - 如何在联合中查询不同类型的相同字段?

    javascript - Graphql 不能返回数组

    node.js - Apollo GraphQL "Cannot return null for non-nullable field Mutation.createUser"

    wordpress - 在 Gatsby 和 GraphQL 的 wordpress 中过滤 ACF Post Object-field

    node.js - 在 GraphQL Playground 中设置我想要使用的测试 header 会导致 "Server cannot be reached"

    javascript - 使用 gatsby-drupal-webform 和 GraphQL 时出现错误未知类型 "webform__webform"

    reactjs - React Native graphql 查询与中继不工作

    python - Graphite 烯 - GraphQL : 'Request' object has no attribute 'context'

    处理混合类型的 GraphQL Schema