GraphQL:带有标量和 InputObjectType 的 UnionType
GraphQL: UnionType with Scalar and InputObjectType
我有一个存储一些视频游戏的数据库。每个都有三个发布日期:一个是欧洲,另一个是美国,最后一个是日本。
我想允许我的 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 会抛出这个错误:
Error: Introspection must provide object type for possibleTypes.
at invariant (chrome-extension://fkkiamalmpiidkljmicmjfbieiclmeij/dist/chromeiql.js:14605:11)
at getObjectType (chrome-extension://fkkiamalmpiidkljmicmjfbieiclmeij/dist/chromeiql.js:72489:80)
at Array.map ()
at buildUnionDef (chrome-extension://fkkiamalmpiidkljmicmjfbieiclmeij/dist/chromeiql.js:72566:47)
at buildType (chrome-extension://fkkiamalmpiidkljmicmjfbieiclmeij/dist/chromeiql.js:725
所以我假设我的类型定义有问题,但我不明白为什么。有什么想法吗?
tl;dr:我想要一个 GraphQL 字段,它可以接受一个标量值 或 一个以该标量类型作为字段的 InputObject。有可能吗?
提前致谢!
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 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 会抛出这个错误:
Error: Introspection must provide object type for possibleTypes. at invariant (chrome-extension://fkkiamalmpiidkljmicmjfbieiclmeij/dist/chromeiql.js:14605:11) at getObjectType (chrome-extension://fkkiamalmpiidkljmicmjfbieiclmeij/dist/chromeiql.js:72489:80) at Array.map () at buildUnionDef (chrome-extension://fkkiamalmpiidkljmicmjfbieiclmeij/dist/chromeiql.js:72566:47) at buildType (chrome-extension://fkkiamalmpiidkljmicmjfbieiclmeij/dist/chromeiql.js:725
所以我假设我的类型定义有问题,但我不明白为什么。有什么想法吗?
tl;dr:我想要一个 GraphQL 字段,它可以接受一个标量值 或 一个以该标量类型作为字段的 InputObject。有可能吗?
提前致谢!
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
}
}
}