如何通过变量GraphQL字段的选择(How to pass variable to GraphQL

2019-10-29 11:22发布

我的示例查询是如下:

%{
      "query" => """
        query getPerson(
            $name: String!
          ){
            getPerson(name: $name) {
              id
              col1
              col2
              col3
              col3
            }
          }
      """,
      "variables" => %{
        "name" => "person_name",
      }
    }

我要动态地选择字段。 例如,对于一个查询我只需要id, col1, col2但对于其他查询id, col1, col3等。 如何使用变量字段?

下面是我尝试这是不正确的。

%{
          "query" => """
            query getPerson(
                $name: String!
              ){
                getPerson(name: $name) {
                  $fields
                }
              }
          """,
          "variables" => %{
            "name" => "person_name",
            "fields" => "id col1 col3",
          }
        }

我是新来graphql。 谁能帮我正确地写呢?

Answer 1:

你不能这样做本身这GraphQL。 变量仅提供特定的(输入)值,并且不定义查询的结构。 (同样的事情在大多数SQL实现真实的。)

您可以通过在GraphQL规范的语法阅读,看看有什么允许的,例如,一个选择集 ; 它只是不允许在你建议的方式来使用变量。

最大限度地减少字符串操作,你需要做的量的一种替代方法是使用命名片段来打包要求的字段列表。 它允许发送你不实际使用的片段。 你可以调整你的查询作为

fragment PersonParts on Person { id col1 col2 col3 }
query GetPerson($name: String!) {
  getPerson(name: $name) { ...PersonParts }
}

如果你有多个命名片段只是交换了这一点,而不是试图动态构造字段列表。



Answer 2:

查询有一个普通的老好串,所以我会用绳子插去药剂,而不是试图用GraphQL变量。

defmodule M do
  def query!(fields) when is_list(fields) do
    fields = Enum.join(fields, "\n        ")

    query =
      ~s"""
        query getPerson(
            $name: String!
          ){
            getPerson(name: $name) {
              #{fields}
            }
          }
      """
    %{
      "query" => query,
      "variables" => %{
        "name" => "person_name",
      }
    }
  end
end

并把它作为M.query!(~w|id col1 col2|)



文章来源: How to pass variable to GraphQL for fields to select