Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 如何为要选择的字段将变量传递给GraphQL_Elixir_Graphql - Fatal编程技术网

Elixir 如何为要选择的字段将变量传递给GraphQL

Elixir 如何为要选择的字段将变量传递给GraphQL,elixir,graphql,Elixir,Graphql,我的示例查询如下: %{ "query" => """ query getPerson( $name: String! ){ getPerson(name: $name) { id col1 col2 col3 col3 }

我的示例查询如下:

%{
      "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新手。有人能帮我正确地编写它吗?

查询中有一个简单的好字符串,因此我会使用Elixir中的字符串插值,而不是尝试使用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 |)

查询中有一个简单的好字符串,因此我将使用Elixir中的字符串插值,而不是尝试使用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 |)

您不能在GraphQL中以本机方式执行此操作。变量只提供特定的(输入)值,不定义查询的结构。(在大多数SQL实现中也是如此。)

您可以通读GraphQL规范中的语法,以查看允许的语法,例如;只是不允许以您建议的方式使用变量

一种最小化字符串操作量的替代方法是使用打包请求字段的列表。它可以发送你实际上不使用的片段。您可以根据需要重新构造查询

Person{id col1 col2 col3}上的片段PersonParts
查询GetPerson($name:String!){
getPerson(name:$name){…PersonParts}
}

如果您有多个命名片段,只需将其交换掉,而不是尝试动态构造字段列表。

您不能在GraphQL中本机执行此操作。变量只提供特定的(输入)值,不定义查询的结构。(在大多数SQL实现中也是如此。)

您可以通读GraphQL规范中的语法,以查看允许的语法,例如;只是不允许以您建议的方式使用变量

一种最小化字符串操作量的替代方法是使用打包请求字段的列表。它可以发送你实际上不使用的片段。您可以根据需要重新构造查询

Person{id col1 col2 col3}上的片段PersonParts
查询GetPerson($name:String!){
getPerson(name:$name){…PersonParts}
}

如果您有多个命名片段,只需将其交换掉,而不是尝试动态构建字段列表。

您可以使用
@include
指令根据标志变量包含
col2
字段:

query getPerson($name: String!, $withCol2: Boolean = false) {
  getPerson(name: $name) {
    id
    col1
    col2 @include(if: $withCol2)
    col3
  }
}

请参见您可以使用
@include
指令根据标志变量包含
col2
字段:

query getPerson($name: String!, $withCol2: Boolean = false) {
  getPerson(name: $name) {
    id
    col1
    col2 @include(if: $withCol2)
    col3
  }
}

请参见

我当前的代码与您上面给出的代码类似。我忘了提到我不想在查询中使用字符串插值,如果可能的话,这是有原因的。因此,我试图找到一种方法来删除
#{fields}
并使用变量。虽然我无法想象有任何理由不使用字符串插值,但另一种选择是使用提供的。我当前的代码与您上面给出的代码类似。我忘了提到我不想在查询中使用字符串插值,如果可能的话,这是有原因的。因此,我试图找到一种方法来删除
{fields}
并使用变量。