如何构造graphql模式以允许检索可能的下拉值?
我试图从GraphQLAPI中获取多个下拉菜单的可能值 例如,假设我有这样一个模式:如何构造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
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中添加更多数据,我需要以某种方式维护用于正确字段的正确查找,处理在多个位置使用的常规查找与只适用于一个字段的超特定查找,等等
有没有其他人遇到过类似的问题,有没有好的设计模式来处理这个问题
作为记录,我不想将枚举与内省结合使用,原因有二
// Client Type
[
{
id: 'ENDOW',
value: 'Foundation/Endowment'
},
{
id: 'PUBLIC',
value: 'Public (Government)'
},
{
id: 'MULTI',
value: 'Union/Multi-Employer'
}
]
还有一些更糟糕,它们有,%等,其中一些是完整的句子,因此枚举的限制性命名在这种情况下确实不起作用。我倾向于只进行一系列查找查询,并将每个查找视为一个不同的业务对象如果需要,您仍然可以为此使用枚举
工程师
,但不能拥有人力资源
。也就是说,如果用下划线代替空格,就可以在客户端转换值值
属性。此属性仅在内部使用。例如,如果您将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"
}]
}
}
}