GraphQL - выполнить подзапрос условно

Я пытаюсь оптимизировать запрос, выполняемый некоторыми из моих компонентов реакции, которые являются общими для всего приложения, такими как компоненты нижнего колонтитула и верхнего колонтитула.

Я пытаюсь не получать информацию о решении для учащихся, когда переменная institutionPath не указана.

query organisationAndInstitution($organisationName: String!, $institutionPath: String!, $fetchInstitution: Boolean!){
    organisation(where: {
      name: $organisationName
    }){
      name
    }

    studentSolutionRelationships(where:{ 
      AND: [
        {
          status: PUBLISHED
        },
        {
          studentSolution: {
            status: PUBLISHED
          }
        }
      ]
    }) @include(if: $fetchInstitution) {
      status
  }
}

Для этого я добавил логическую переменную fetchInstitution и директиву @include(if: $fetchInstitution).

Но кажется, что директивы применяются только к полям, а не ко всем запросам. Поэтому мне интересно, возможно ли то, что я хочу сделать, потому что то, как я это написал, неверно.

studentSolutionRelationships и organisation по-прежнему являются полями, просто они являются полями в корневом типе операции запроса. В вашем подходе нет ничего неправильного. Когда вы говорите, что это «недействительно», что вы имеете в виду? Какую ошибку вы видите?
Daniel Rearden 23.04.2019 01:52

FWIW, я вижу отсутствующую закрывающую скобку, но это может быть просто опечатка здесь, а не в вашем коде.

Daniel Rearden 23.04.2019 01:53

Когда я пытаюсь выполнить это, запрос зависает и в конечном итоге истекает время ожидания. Я использую не свой собственный сервер graphql, а сторонний, поэтому, возможно, такие вещи не реализованы на их бэкэнде. Но я не сильно отлаживал, так как думал, что делаю это неправильно, я посмотрю глубже. Спасибо! (и опечатка в том, что я удалил здесь много шума, чтобы сосредоточиться на том, что важно)

Vadorequest 24.04.2019 09:46

И действительно, ты был прав. Запрос хорошо работает на graphiql, но мой исходный код дал сбой, я думаю, он был либо неправильно переведен, либо я допустил ошибку в коде. В любом случае, это правильный способ получения необязательных полей!

Vadorequest 24.04.2019 09:50

Это действительно была глупая ошибка в моем коде (не предоставление новой переменной для всех вызовов, использующих этот запрос). Если вы хотите написать правильный ответ, я приму его и закрою вопрос :)

Vadorequest 24.04.2019 10:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
2
5
2 483
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Любое поле в документе GraphQL может быть явно включены с помощью директивы @include или явно не входит с помощью директивы @skip. Директива должна быть указана после имени поля и аргументов, но перед набором выбора поля, если он есть, как показано в вашем вопросе:

studentSolutionRelationships(where:{ 
  #...input fields omitted for brevity
}) @include(if: $fetchInstitution) {
  status
}

Директива принимает один аргумент (if), который должен быть значением Boolean. Это значение может быть литералом (например, true или false) или переменной типа Boolean. GraphQL не предоставляет способа оценки выражений — любая условная логика должна находиться в клиентском коде и использоваться для определения значения переменной, переданной в аргумент if.

Директивы могут применяться к полю Любые в документе, в том числе к корневым, таким как studentSolutionRelationships и organisation в вопросе. На самом деле вы можете исключить все корневые поля с помощью этих директив — просто имейте в виду, что в таком случае запрос все равно будет выполняться и просто вернет пустой объект.

Другими словами, ваш подход здесь правильный. Если запрос не выполняется, это происходит из-за несвязанной проблемы.

Другие вопросы по теме