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

Do GraphQL fields support polymorphism based on passed in arguments?

我想定义以下查询

{
// return all individuals
individuals {
    id
  }
}

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

注意查询名称是一样的,只是参数不同

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

如何定义多态查询?有可能吗?

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

Do GraphQL fields have the ability to return different results based on the arguments or argument types passed in?

简短的回答是 "no"。 GraphQL 的一个重要 属性 是特定字段必须始终 return 相同的类型;这意味着 return 为数组的字段必须始终 return 数组,而 return 为对象类型的字段必须始终 return 该特定类型,无论传入的参数。

但是,您可以通过几种方法获得类似的结果,以避免需要创建太多不同的命名字段:

  1. GraphQL 字段可以有可选参数。因此,例如,如果您有一个名为 individuals 的字段,您可以使用可选参数来提供不同类型的过滤器,例如:individuals(search: "Dan")individuals(status: "admin"),或 individuals(与无参数)或 individuals(status: "admin", search: "Dan")(同时提供两个参数。
  2. GraphQL 字段可以 return 多个对象类型的联合。所以如果你的领域可以 return 几种不同类型的东西,你可以使用联合。这在文档的 SearchResult 示例中表示:http://graphql.org/learn/schema/#union-types 不幸的是,这不适用于此处,因为您不能将数组与对象类型结合。

但在许多情况下,您将需要创建多个字段,因为 GraphQL 目前没有方法重载或多态性。