假设您有一个GraphQL类型,它包含许多字段。
如何查询所有字段而不写下一个长查询,其中包括所有字段的名称?
例如,如果我有这些字段:
public function fields()
{
return [
'id' => [
'type' => Type::nonNull(Type::string()),
'description' => 'The id of the user'
],
'username' => [
'type' => Type::string(),
'description' => 'The email of user'
],
'count' => [
'type' => Type::int(),
'description' => 'login count for the user'
]
];
}
要查询所有字段,查询通常是这样的:
FetchUsers{users(id:"2"){id,username,count}}
但我想要一种方法来获得相同的结果,而不需要写所有的字段,就像这样:
FetchUsers{users(id:"2"){*}}
//or
FetchUsers{users(id:"2")}
有没有办法在GraphQL中做到这一点??
我正在使用Folkloreatelier/ laravell -graphql库。
当我需要从谷歌places API加载已序列化到数据库中的位置数据时,我也遇到了同样的问题。一般来说,我想要整个东西,这样它就能与map一起工作,但我不想每次都必须指定所有字段。
我在Ruby中工作,所以我不能给你PHP实现,但原则应该是相同的。
我定义了一个称为JSON的自定义标量类型,它只返回一个文字JSON对象。
ruby的实现是这样的(使用graphql-ruby)
module Graph
module Types
JsonType = GraphQL::ScalarType.define do
name "JSON"
coerce_input -> (x) { x }
coerce_result -> (x) { x }
end
end
end
然后我把它用在我们的对象上
field :location, Types::JsonType
不过我会非常谨慎地使用它,只在您知道总是需要整个JSON对象的地方使用它(就像我在我的例子中所做的那样)。否则,更一般地说,它会打败GraphQL的对象。
GraphQL查询格式的设计是为了允许:
查询和结果形状完全相同。
服务器确切地知道所请求的字段,因此客户端只下载必要的数据。
然而,根据GraphQL文档,你可以创建片段,以使选择集更可重用:
# Only most used selection properties
fragment UserDetails on User {
id,
username
}
然后,您可以通过以下方式查询所有用户详细信息:
FetchUsers {
users() {
...UserDetails
}
}
你也可以在片段旁边添加其他字段:
FetchUserById($id: ID!) {
users(id: $id) {
...UserDetails
count
}
}
当我需要从谷歌places API加载已序列化到数据库中的位置数据时,我也遇到了同样的问题。一般来说,我想要整个东西,这样它就能与map一起工作,但我不想每次都必须指定所有字段。
我在Ruby中工作,所以我不能给你PHP实现,但原则应该是相同的。
我定义了一个称为JSON的自定义标量类型,它只返回一个文字JSON对象。
ruby的实现是这样的(使用graphql-ruby)
module Graph
module Types
JsonType = GraphQL::ScalarType.define do
name "JSON"
coerce_input -> (x) { x }
coerce_result -> (x) { x }
end
end
end
然后我把它用在我们的对象上
field :location, Types::JsonType
不过我会非常谨慎地使用它,只在您知道总是需要整个JSON对象的地方使用它(就像我在我的例子中所做的那样)。否则,更一般地说,它会打败GraphQL的对象。