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

新手上路,请多包涵

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

原文由 BlackSigma 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 423
2 个回答

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

原文由 Peter Horne 发布,翻译遵循 CC BY-SA 3.0 许可协议

是的,您 可以 使用 自省 来做到这一点。进行类似的 GraphQL 查询(对于 UserType 类型

 {
   __type(name:"UserType") {
      fields {
         name
         description
      }
   }
}

并且您会得到类似的响应(实际字段名称将取决于您的实际架构/类型定义)

 {
  "data": {
    "__type": {
      "fields": [
        {
          "name": "id",
          "description": ""
        },
        {
          "name": "username",
          "description": "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."
        },
        {
          "name": "firstName",
          "description": ""
        },
        {
          "name": "lastName",
          "description": ""
        },
        {
         "name": "email",
          "description": ""
        },
        ( etc. etc. ...)
      ]
    }
  }
}

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

这取决于您知道要为其获取字段的类型的名称——如果您不知道类型,您可以使用内省将所有类型和字段放在一起,例如

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

注意:这是无线 GraphQL 数据——您需要自己弄清楚如何使用您的实际客户端进行读写。您的 graphQL javascript 库可能已经在某些方面使用了自省,例如 apollo codegen 命令使用自省来生成类型。

20222更新

由于此答案最初是编写的,因此现在推荐的安全做法是在生产中 关闭 自省。参考: 为什么你应该在生产中禁用 graphql 自省

对于在生产中关闭自省的环境,您可以在开发中使用它来帮助创建在生产中使用的静态查询;您实际上无法在生产中动态创建查询。

原文由 Mark Chackerian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题