Как передать переменную в GraphQL для выбора полей - PullRequest
0 голосов
/ 20 декабря 2018

Мой пример запроса следующий:

%{
      "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.Может кто-нибудь помочь мне написать это правильно?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вы не можете сделать это изначально в GraphQL.Переменные предоставляют только определенные (входные) значения и не определяют структуру запроса.(То же самое верно в большинстве реализаций SQL.)

Вы можете прочитать грамматику в спецификации GraphQL, чтобы увидеть, что разрешено, например, в наборе выбора ;просто нельзя использовать переменные так, как вы предлагаете.

Одна альтернатива, которая сводит к минимуму количество манипуляций со строками, которые вам нужно сделать, - это использовать именованные фрагменты для упаковки списка запрошенныхполя.Разрешено отправлять фрагменты, которые вы на самом деле не используете.Вы можете реструктурировать свой запрос как

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

, и если у вас есть несколько именованных фрагментов, просто поменяйте их местами, вместо того, чтобы пытаться динамически создать список полей.

0 голосов
/ 20 декабря 2018

В запросе есть простая старая хорошая строка, поэтому я бы использовал интерполяцию строк в 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|).

...