GraphQL:具有标量和 InputObjectType 的 UnionType

Posted

技术标签:

【中文标题】GraphQL:具有标量和 InputObjectType 的 UnionType【英文标题】:GraphQL: UnionType with Scalar and InputObjectType 【发布时间】:2021-05-21 22:48:43 【问题描述】:

我有一个存储一些视频游戏的数据库。它们每个都有三个发布日期:一个在欧洲,另一个在美国,最后一个在日本。

我想允许我的 GraphQL API 的用户根据这些日期搜索游戏。例如,为了获得在欧美发行但在日本发行的游戏的名称和发行日期,我们可以编写这样的查询:


  games(has_been_released:  eur: true, usa: true, jap: false ) 
    data 
      name
      release_date
    
  

因此,如果我们要获取所有地区发布的游戏,查询将是这个:


  games(has_been_released:  eur: true, usa: true, jap: true) 
    data 
      name
      release_date
    
  

当所有布尔值都具有相同的值时,我想简化查询,以便我们可以编写以下代码:


  games(has_been_released: true) 
    data 
      name
      release_date
    
  

为了做到这一点,我尝试了字段 has_been_released 的这种类型定义(使用 graphql-php):

<?php

$regionalizedBooleanInput = new InputObjectType([
    'name' => 'RegionalizedBooleanInput',
    'description' => 'An object with properties "eur", "usa" and "jap" as booleans',
    'fields' => [
        'eur' => ['type' => Type::boolean(), 'defaultValue' => null],
        'usa' => ['type' => Type::boolean(), 'defaultValue' => null],
        'jap' => ['type' => Type::boolean(), 'defaultValue' => null],
    ]
]);

$booleanOrRegionalizedBooleanInputType = new UnionType([
    'name' => 'BooleanOrRegionalizedBooleanInput',
    'description' => 'A boolean that can be different according to regions',
    'types' => [
        Type::boolean(),
        $regionalizedBooleanInput,
    ],
    'resolveType' => function($value) use ($regionalizedBooleanInput) 
        if ($value->type === 'boolean') 
            return Type::boolean();
        
                
        return $regionalizedBooleanInput;
    ,
]);

但是当我这样做时,GraphiQL 会抛出这个错误:

错误:自省必须为可能的类型提供对象类型。 在不变量(chrome-extension://fkkiamalmpiidkljmicmjfbieiclmeij/dist/chromeiql.js:14605:11) 在 getObjectType (chrome-extension://fkkiamalmpiidkljmicmjfbieiclmeij/dist/chromeiql.js:72489:80) 在 Array.map () 在 buildUnionDef (chrome-extension://fkkiamalmpiidkljmicmjfbieiclmeij/dist/chromeiql.js:72566:47) 在 buildType (chrome-extension://fkkiamalmpiidkljmicmjfbieiclmeij/dist/chromeiql.js:725

所以我认为我的类型定义有问题,但我不明白为什么。有什么想法吗?

tl;dr:我想要一个 GraphQL 字段,它可以接受一个标量值一个具有这种标量类型的 InputObject 作为字段。有可能吗?

提前致谢!

【问题讨论】:

【参考方案1】:

GraphQL 目前不支持多态输入类型或联合输入。 https://github.com/graphql/graphql-spec/issues/488

一种解决方案可以是 all_regions 到输入模式的一部分,但不是强制性的

input Regions
   eur: Boolean
   usa: Boolean
   jpa: Boolean
   all_regions: Boolean


    
      games(has_been_released:  all_regions: true) 
        data 
          name
          release_date
        
      
    

【讨论】:

以上是关于GraphQL:具有标量和 InputObjectType 的 UnionType的主要内容,如果未能解决你的问题,请参考以下文章

对于 AWS amplify 中的模式,graphql 中的数组和映射是不是有标量类型?

GraphQL.js - 时间戳标量类型?

如何使用 GraphQL ruby​​ gem 公开标量类型

graphql,联合标量类型?

对 Type-graphql 和 Typeorm 实体中的外键字段使用 ID 标量类型在语义上是不是正确?

在一个请求中接受一组动态大小和常见标量类型的 GraphQL 突变