Php 如何在不编写长查询的情况下查询所有GraphQL类型字段?

Php 如何在不编写长查询的情况下查询所有GraphQL类型字段?,php,laravel,graphql,graphql-php,Php,Laravel,Graphql,Graphql Php,假设您有一个GraphQL类型,它包含许多字段。 如何在不写下包含所有字段名称的长查询的情况下查询所有字段 例如,如果我有以下字段: public function fields() { return [ 'id' => [ 'type' => Type::nonNull(Type::string()), 'description' => 'The id of th

假设您有一个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中是否有这样做的方法


我正在使用Allocaterier/laravel graphql库。

我想唯一的方法是利用可重用片段:

fragment UserFragment on Users {
    id
    username
    count
} 

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

我想唯一的方法是利用可重用的片段:

fragment UserFragment on Users {
    id
    username
    count
} 

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

不幸的是,你想做的是不可能的。GraphQL要求您明确指定希望从查询中返回哪些字段。

不幸的是,您不可能这样做。GraphQL要求您明确指定希望从查询返回的字段。

当我需要从google places API将序列化的位置数据加载到数据库中时,我遇到了同样的问题。一般来说,我希望整个过程能够与地图一起工作,但我不希望每次都必须指定所有字段

我在Ruby中工作,所以我不能给出PHP实现,但原理应该是一样的

我定义了一个名为JSON的自定义标量类型,它只返回一个文本JSON对象

ruby实现是这样的(使用graphql ruby)

然后我把它用在我们的物体上

field :location, Types::JsonType

不过,我会非常谨慎地使用它,只在您知道始终需要整个JSON对象的情况下使用它(就像我在本例中所做的那样)。否则,一般来说,它会破坏GraphQL的对象。

当我需要加载从google places API序列化到数据库中的位置数据时,我遇到了同样的问题。一般来说,我希望整个过程能够与地图一起工作,但我不希望每次都必须指定所有字段

我在Ruby中工作,所以我不能给出PHP实现,但原理应该是一样的

我定义了一个名为JSON的自定义标量类型,它只返回一个文本JSON对象

ruby实现是这样的(使用graphql ruby)

然后我把它用在我们的物体上

field :location, Types::JsonType

不过,我会非常谨慎地使用它,只在您知道始终需要整个JSON对象的情况下使用它(就像我在本例中所做的那样)。否则,从更广泛的意义上讲,它将破坏GraphQL的对象。

是的,您可以使用。进行如下图形SQL查询(对于类型UserType

您将得到如下响应(实际字段名将取决于实际的模式/类型定义)

然后,您可以读取客户机中的字段列表,并动态构建第二个GraphQL查询以获取所有这些字段的值

这取决于您知道要获取字段的类型的名称——如果您不知道类型,可以使用类似于

{
  __schema {
    types {
      name
      fields {
        name
        description
      }
    }
  }
}

注意:这是线上图形QL数据——您可以自己决定如何使用实际客户机进行读写。您的graphQL javascript库可能已经在某些功能中使用了内省功能,例如,该命令使用内省来生成类型。

是的,您可以使用。进行如下图形SQL查询(对于类型UserType

您将得到如下响应(实际字段名将取决于实际的模式/类型定义)

然后,您可以读取客户机中的字段列表,并动态构建第二个GraphQL查询以获取所有这些字段的值

这取决于您知道要获取字段的类型的名称——如果您不知道类型,可以使用类似于

{
  __schema {
    types {
      name
      fields {
        name
        description
      }
    }
  }
}
注意:这是线上图形QL数据——您可以自己决定如何使用实际客户机进行读写。您的graphQL javascript库可能已经在某些功能中使用了内省功能,例如,该命令使用内省来生成类型。

旨在允许:

  • 查询和结果形状必须完全相同
  • 服务器准确地知道所请求的字段,因此客户端只下载基本数据
  • 但是,根据,您可以创建以使选择集更具可重用性:

    # Only most used selection properties
    
    fragment UserDetails on User {
        id,
        username
    } 
    
    然后,您可以通过以下方式查询所有用户详细信息:

    FetchUsers {
        users() {
            ...UserDetails
        }
    }
    
    您还可以:

    设计的目的是为了允许:

  • 查询和结果形状必须完全相同
  • 服务器准确地知道所请求的字段,因此客户端只下载基本数据
  • 但是,根据,您可以创建以使选择集更具可重用性:

    # Only most used selection properties
    
    fragment UserDetails on User {
        id,
        username
    } 
    
    然后,您可以通过以下方式查询所有用户详细信息:

    FetchUsers {
        users() {
            ...UserDetails
        }
    }
    
    您还可以:


    包graphql类型json支持自定义标量类型json。 使用它可以显示json对象的所有字段。 下面是ApolloGraphql服务器中示例的链接。

    包graphql类型json支持自定义标量类型json。 使用它可以显示json对象的所有字段。 下面是ApolloGraphql服务器中示例的链接。

    如果我这样做了,那么我仍然必须“至少在片段中”写入每个字段名,这是我试图避免的,似乎GraphQL迫使我们显式。如何在POSTMan查询中添加这一点?或jquery/UI框架来生成字符串化的JSON。这个graphiQL对于实际的开发目的似乎是无用的。这仅仅是为了重用的目的。@BlackSigma考虑到,这应该是最好的answer@JPVentura:不,我的朋友,可重用性和通配符bo之间有区别