假设您有一个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库。


当前回答

graphql-type-json包支持自定义标量类型JSON。 使用它可以显示json对象的所有字段。 下面是ApolloGraphql Server中的示例链接。 https://www.apollographql.com/docs/apollo-server/schema/scalars-enums/#custom-scalars

其他回答

我想做到这一点的唯一方法是利用可重用的片段:

fragment UserFragment on Users {
    id
    username
    count
} 

FetchUsers {
    users(id: "2") {
        ...UserFragment
    }
}

graphql-type-json包支持自定义标量类型JSON。 使用它可以显示json对象的所有字段。 下面是ApolloGraphql Server中的示例链接。 https://www.apollographql.com/docs/apollo-server/schema/scalars-enums/#custom-scalars

GraphQL查询格式的设计是为了允许:

查询和结果形状完全相同。 服务器确切地知道所请求的字段,因此客户端只下载必要的数据。

然而,根据GraphQL文档,你可以创建片段,以使选择集更可重用:

# Only most used selection properties

fragment UserDetails on User {
    id,
    username
} 

然后,您可以通过以下方式查询所有用户详细信息:

FetchUsers {
    users() {
        ...UserDetails
    }
}

你也可以在片段旁边添加其他字段:

FetchUserById($id: ID!) {
    users(id: $id) {
        ...UserDetails
        count
    }
}

不幸的是,你想做的是不可能的。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的对象。