Как применить фильтр Hasura `where`, только если переменная не равна нулю? - PullRequest
1 голос
/ 23 апреля 2019

У меня такой запрос:

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] } } }' : '' }) {
`

Некоторые вещи, которые я пробовал:

  • Использование директив GraphQL подобно @skip и @include, но, похоже, они применяются только к возвращаемым полям, а не к какой-либо части where фильтра
  • Используя Hasura boolExp s , как _is_null и _or, но кажется, что они не могут напрямую проверять переменные, они могут только сравнивать переменные с содержимым столбцов

1 Ответ

0 голосов
/ 23 апреля 2019

Кажется, что сопоставление со всеми, если переменная равна нулю, является поведением по умолчанию, если используется _eq boolExp. Я не видел этого, потому что этот запрос использовал _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 может совпадать со значениями, которые установлены как пустые в обнуляемых столбцах).

Следовательно, { _eq: null } логически не может ничего сопоставить, поэтому он просто оптимизирован. Это:

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

... становится таким:

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

... и поскольку {} равно trueExp, считая его истинным, оно оптимизируется, чтобы быть эффективным WHERE 'true'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...