【发布时间】:2021-07-22 09:33:07
【问题描述】:
我有一个这样的 graphql 查询:
query SomeQuery($id: Int) {
some_query(where: {id: {_eq: $id}}) {
id
name
}
}
当我运行它时,它期望 id 作为变量。如何使该变量可选?当没有给出id 时,它应该显示所有结果
【问题讨论】:
标签: sql reactjs select graphql hasura
我有一个这样的 graphql 查询:
query SomeQuery($id: Int) {
some_query(where: {id: {_eq: $id}}) {
id
name
}
}
当我运行它时,它期望 id 作为变量。如何使该变量可选?当没有给出id 时,它应该显示所有结果
【问题讨论】:
标签: sql reactjs select graphql hasura
这个变量$id: Int 已经被声明为可选的,你需要包含!运营商$id: Int!。逻辑需要存在于服务器中以检查传递的 id 是否为空/空,然后返回所有内容。
【讨论】:
我不知道将变量声明为可选,但也让它忽略表达式的其余部分,就像您在这里使用 Hasura 演示的那样。
相反,您应该定义您的查询,使您收到的变量是实际的布尔表达式,并且有条件地从调用者传递变量。尝试像这样编写查询:
query getItems($where: items_bool_exp) {
items(where: $where) {
name
}
}
这使过滤器成为可选的,因此如果您将 null 传递给$where,您将取回所有内容。否则,您可以将实际过滤条件作为变量传递并返回您期望的结果
{
"where": {
"id": {
"_eq": 42
}
}
}
您只需更新实际发出查询的客户端,以使用关于是否应发送 ID 谓词的正确条件逻辑。
【讨论】:
items_bool_exp 来自哪里?我认为它可能是一个可以忽略的空值,但在我的 api 上我只是得到未知类型。
由于这是用reactjs标记的,这里有一个JS的解决方案。
这实际上是可能的,但在创建查询时需要一些字符串插值。
const generateSomeQuery = (id?: string) => gql`
query SomeQuery(
${id ? '$id: uuid' : ''}
) {
some_query(
where: {
${id ? 'id: {_eq: $id}' : ''}
}
) {
id
name
}
}
`
【讨论】: