使 GraphQL 模式中需要的两个字段之一?
Make one of two fields required in GraphQL schema?
我正在使用 Graphcool 但这可能是一个一般的 GraphQL 问题。有没有办法使两个字段之一成为必填字段?
例如说我有一个 Post 类型。 Posts 必须附加到组或事件。这可以在架构中指定吗?
type Post {
body: String!
author: User!
event: Event // This or group is required
group: Group // This or event is required
}
我的实际需求有点复杂。 Posts 可以附加到一个事件,或者必须附加到一个组和一个位置。
type Post {
body: String!
author: User!
event: Event // Either this is required,
group: Group // Or both Group AND Location are required
location: Location
}
所以这是有效的:
mutation {
createPost(
body: "Here is a comment",
authorId: "<UserID>",
eventId: "<EventID>"
){
id
}
}
是这样的:
mutation {
createPost(
body: "Here is a comment",
authorId: "<UserID>",
groupID: "<GroupID>",
locationID: "<LocationID>"
){
id
}
}
但这不是:
是这样的:
mutation {
createPost(
body: "Here is a comment",
authorId: "<UserID>",
groupID: "<GroupID>",
){
id
}
}
您无法根据需要定义架构来定义输入组——每个输入都可以单独为空(可选)或非空(必需)。
处理此类情况的唯一方法是在特定查询或变更的解析器中。例如:
(obj, {eventId, groupID, locationID}) => {
if (
(eventID && !groupID && !locationID) ||
(groupID && locationID && !eventID)
) {
// resolve normally
}
throw new Error('Invalid inputs')
}
看来要使用 Graphcool 做到这一点,您必须使用自定义解析器。 See the documentation for more details.
在模式中表示这一点的一种方法是使用 unions ,在您的情况下可能是这样的:
type LocatedGroup {
group: Group!
location: Location!
}
union Attachable = Event | LocatedGroup
type Post {
body: String!
author: User!
attachable: Attachable!
}
我正在使用 Graphcool 但这可能是一个一般的 GraphQL 问题。有没有办法使两个字段之一成为必填字段?
例如说我有一个 Post 类型。 Posts 必须附加到组或事件。这可以在架构中指定吗?
type Post {
body: String!
author: User!
event: Event // This or group is required
group: Group // This or event is required
}
我的实际需求有点复杂。 Posts 可以附加到一个事件,或者必须附加到一个组和一个位置。
type Post {
body: String!
author: User!
event: Event // Either this is required,
group: Group // Or both Group AND Location are required
location: Location
}
所以这是有效的:
mutation {
createPost(
body: "Here is a comment",
authorId: "<UserID>",
eventId: "<EventID>"
){
id
}
}
是这样的:
mutation {
createPost(
body: "Here is a comment",
authorId: "<UserID>",
groupID: "<GroupID>",
locationID: "<LocationID>"
){
id
}
}
但这不是:
是这样的:
mutation {
createPost(
body: "Here is a comment",
authorId: "<UserID>",
groupID: "<GroupID>",
){
id
}
}
您无法根据需要定义架构来定义输入组——每个输入都可以单独为空(可选)或非空(必需)。
处理此类情况的唯一方法是在特定查询或变更的解析器中。例如:
(obj, {eventId, groupID, locationID}) => {
if (
(eventID && !groupID && !locationID) ||
(groupID && locationID && !eventID)
) {
// resolve normally
}
throw new Error('Invalid inputs')
}
看来要使用 Graphcool 做到这一点,您必须使用自定义解析器。 See the documentation for more details.
在模式中表示这一点的一种方法是使用 unions ,在您的情况下可能是这样的:
type LocatedGroup {
group: Group!
location: Location!
}
union Attachable = Event | LocatedGroup
type Post {
body: String!
author: User!
attachable: Attachable!
}