Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何构造graphql模式以允许检索可能的下拉值?_Graphql - Fatal编程技术网

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

如何构造graphql模式以允许检索可能的下拉值?,graphql,Graphql,我试图从GraphQLAPI中获取多个下拉菜单的可能值 例如,假设我有这样一个模式: 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

我试图从GraphQLAPI中获取多个下拉菜单的可能值

例如,假设我有这样一个模式:

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中添加更多数据,我需要以某种方式维护用于正确字段的正确查找,处理在多个位置使用的常规查找与只适用于一个字段的超特定查找,等等

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

作为记录,我不想将枚举与内省结合使用,原因有二

  • 随着我们在现有数据中的查找数量的增加,将需要非常频繁的模式更新
  • 对于枚举,您只能获得一个值,我需要一个代码,该代码将用作DB中的主键,以及一个描述性值,该值将显示在UI中
  • 编辑 我想再举一个例子说明为什么枚举可能不起作用。我们有很多描述,应该在包含特殊字符的下拉列表中显示

    // Client Type
    [
      {
        id: 'ENDOW',
        value: 'Foundation/Endowment'
      },
      {
        id: 'PUBLIC',
        value: 'Public (Government)'
      },
      {
        id: 'MULTI',
        value: 'Union/Multi-Employer'
      }
    ]
    

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

    如果需要,您仍然可以为此使用枚举

  • 内省查询可以像其他查询一样在客户端使用。根据您使用的服务器端实现/框架,您可能必须在生产中显式启用内省。当应用程序加载时,客户端可以查询可能的枚举值——无论架构更改多少次,客户端都将始终显示正确的枚举值
  • 枚举值不限于所有CAP,尽管它们不能包含空格。因此,您可以拥有
    工程师
    ,但不能拥有
    人力资源
    。也就是说,如果用下划线代替空格,就可以在客户端转换值
  • 我不能谈论非JavaScript实现,但GraphQL.js支持为每个枚举值分配
    属性。此属性仅在内部使用。例如,如果您将enum作为参数接收,您将得到
    2
    ,而不是
    Engineer
    。同样,您将在解析器中返回
    2
    ,而不是
    Engineer
    。您可以看到如何使用Apollo服务器完成此操作

  • 我找到了一种让枚举按我需要的方式工作的方法。我可以通过将其放入

    这是我的gql模式定义

    enum ClientType {
        """
        Public (Government)
        """
        PUBLIC
        """
        Union/Multi-Employer
        """
        MULTI
        """
        Foundation/Endowment
        """
        ENDOW
    }
    
    当我用这样的自省查询检索它时

    {
      __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文件。每当数据更新时(这种情况并不经常发生),我只需重新运行代码生成器,并将架构更改发布到生产环境。

    感谢您的解释,但在我们的许多情况下,使用查找值是不起作用的,因为我们有包含数字、%和撇号等的查找值。它确实需要是一个字符串字段。除此之外,我正在使用apollo cli生成typescript定义,并且每次更新其中一个值时都需要重新运行该定义,因此我确实倾向于远离枚举。如果您担心在整个应用程序中重复查询和突变字段,请使用apollo片段。例如,这是针对Apollo Angular的:我关心的是创建许多特定于对象上的字段的查询端点,并维护关于哪个查询应该用于哪个字段的文档。i、 e.如果我有jobRole、state、country和100个其他查询来获取要在下拉列表中使用的值,以便为各种对象的突变提供可能的值,我如何构建它,以便能够跟踪哪个查询为哪个字段提供有效选项?我不确定我是否理解您的担忧,因为GraphQL只有一个端点,通常在任何URL中都有端口3000。我怀疑你还在想休息,正如我在过去几个月里发现的那样,思考是一种负担。我只为片段创建了一个单独的文件,这样我就可以在组件之间共享它,这样可以防止在查询和转换中反复创建相同的字段。它对我的代码进行了大量清理,并为我提供了一个易于理解的地方来进行更改-DRY。我知道它只有一个端点,我要说的是根查询上所有不同的查找类型(作业类型、州、国家等)
    {
        "data": {
            "__type": {
                "enumValues": [{
                    "name": "PUBLIC",
                    "description": "Public (Government)"
                }, {
                    "name": "MULTI",
                    "description": "Union/Multi-Employer"
                }, {
                    "name": "ENDOW",
                    "description": "Foundation/Endowment"
                }]
            }
        }
    }