GraphQL字段是否支持基于传入参数的多态性?

时间:2016-10-21 19:43:18

标签: graphql graphql-js

我想定义以下查询

{
// return all individuals
individuals {
    id
  }
}

// return ONE individual by id
individuals(id:"123") {
   id
  }
}

请注意,查询名称相同,只有参数不同。

今天,我找到的唯一解决方法是定义不同的查询名称。

如何定义多态查询?它甚至可能吗?

1 个答案:

答案 0 :(得分:10)

GraphQL查询根目录下可访问的字段在GraphQL架构中定义为根查询类型上的字段,通常简称为Query。此类型与架构中的任何其他GraphQL对象类型完全相同。所以这个问题可以重申为:

  

GraphQL字段是否能够根据传入的参数或参数类型返回不同的结果?

简短的回答是" no"。 GraphQL的一个重要特性是特定字段必须始终返回相同的类型;这意味着返回数组的字段必须始终返回一个数组,并且返回对象类型的字段必须始终返回该特定类型,而不管传入的参数如何。

但是,有几种方法可以实现类似的结果,以避免需要创建太多不同的命名字段:

  1. GraphQL字段可以包含可选参数。因此,例如,如果您有一个名为individuals的字段,则可以使用可选参数来提供不同类型的过滤器,例如:individuals(search: "Dan")individuals(status: "admin")individuals(带有没有参数)或individuals(status: "admin", search: "Dan")(两个参数一次提供。
  2. GraphQL字段可以返回多个对象类型的并集。因此,如果您的字段可以返回多种不同类型的内容,则可以使用union。这在文档中的SearchResult示例中表示:http://graphql.org/learn/schema/#union-types遗憾的是,由于您无法将数组与对象类型结合在一起,因此不适用于此。
  3. 但在许多情况下,您需要创建多个字段,因为GraphQL当前没有方法重载或多态。