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

Posted

技术标签:

【中文标题】GraphQL 字段是不是支持基于传入参数的多态性?【英文标题】:Do GraphQL fields support polymorphism based on passed in arguments?GraphQL 字段是否支持基于传入参数的多态性? 【发布时间】:2017-03-04 05:18:00 【问题描述】:

我想定义以下查询


// return all individuals
individuals 
    id
  


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

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

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

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

【问题讨论】:

我不确定您在这里所说的“查询名称”是什么意思 - 您指的是根查询类型上的字段名称吗? 这里解释graphql.org/learn/queries在上面的例子中,查询名称是“个人” 【参考方案1】:

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

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

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

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

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

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

【讨论】:

对于id 的项目,我返回一个1 数组,没有id,一个n 数组。似乎运作良好。

以上是关于GraphQL 字段是不是支持基于传入参数的多态性?的主要内容,如果未能解决你的问题,请参考以下文章

具有基于参数的动态字段的 GraphQL ObjectType

graphql-spqr 无法查询父类字段

GraphQL 如何在子字段级别启用基于 ID 的查询?

如何根据传入参数的值有条件地应用 GraphQL 过滤器?

Graphql 字段上的未知参数

Apollo 中的缓存正在避免 GraphQL 解决多态关联