13

我有一个这样的查询:

query getUsers ($setId: Int) {
  user(where: { user_sets: { set_id: { _in: [$setId] } } }) {
    id
    name
    status
    user_sets {
      set {
        name
      }
    }
    # more fields...
  }
}

我正在寻找的是一种不应用过滤器并在为空where时提供所有条目的方法。$setId我想避免动态编写查询 - 这样做很容易,但我们希望在静态 .graphql 文件中进行查询:

const query = `
query getUsers (${ setId ? '$setId: Int' : ''}) {
  user(${ setId ? 'where: { user_sets: { set_id: { _in: [$setId] } } }' : '' }) {
`

我尝试过的一些事情:

  • 使用像and这样的GraphQL 指令,但这些指令似乎只适用于返回的字段,而不适用于过滤器的任何部分@skip@includewhere
  • 使用Hasura boolExps like _is_nulland _or,但似乎这些不能直接测试变量,它们只能将变量与列内容进行比较
4

3 回答 3

7

这种行为在 v1.3.4 之间发生了变化。因此有两个正确答案。

您可以在hasura 存储库中阅读有关此更改的更多信息。

1.3.4 版之前

这个答案描述了它。

版本 1.3.4 之后

在默认情况下使用null比较是危险的,true因为意外未设置的变量可能会导致删除表。维护人员删除了这种行为,但通过设置变量使其可访问HASURA_GRAPHQL_V1_BOOLEAN_NULL_COLLAPSE

{_eq: null}Hasura 比较时会抛出错误,因为假设这是一个错误。

如果您想与一个值进行比较并评估true该值何时是null您需要在客户端站点上处理这种情况并将整个布尔表达式传递给 hasura。

query getUsers ($userSetsWhere: user_sets_bool_exp) {
  user(where: { user_sets: { $userSetsWhere } }) {
    id
    name
    status
    user_sets {
      set {
        name
      }
    }
    # more fields...
  }
}
const userSetsWhere = setId ? { set_id: { _eq: $setId } } : {};

它的作用是,只有在值不是null或非undefined空表达式被传递给 hasura 的情况下。

于 2021-07-16T11:40:21.007 回答
6

_eq如果使用boolExp,则如果变量为 null 似乎匹配所有是默认行为。我没有看到这个,因为这个查询正在使用_in.

如果 $setId 以以下方式传递,则更改为此将提供所有项目null

query getUsers ($setId: Int) {
  user(where: { user_sets: { set_id: { _eq: $setId } } }) {
    id
    name
    status
    user_sets {
      set {
        name
      }
    }
    # more fields...
  }
}

这是因为 Hasura 遵循 SQL,因为它null无法与任何东西进行比较(只能_is_null匹配可空列中设置为 null 的值)。

因此,{ _eq: null }逻辑上无法匹配任何东西,所以它只是被优化掉了。这个:

(where: { user_sets: { set_id: { _eq: $setId } } })

...变成这样:

(where: { user_sets: { set_id: {} } }

...并且因为{}is trueExp,被视为 true ,所以它优化为有效WHERE 'true'

于 2019-04-23T11:10:21.187 回答
5

对于这种情况,您可以使用 bool 表达式作为绑定变量

query getUsers ($condition: user_bool_exp!) {
  user (where: $condition) {
    id
    name
    status
    user_sets {
      set {
        name
      }
    }
    # more fields...
  }
}

你可以根据你的变量建立条件

{ condition: { user_sets: { set_id: { _in: [$setId] } } } }

或者

{ condition: { user_sets: {} }
于 2021-03-17T09:08:25.087 回答