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}
并使用变量。