使 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!
}