GraphQL - выполнить подзапрос условно - PullRequest
0 голосов
/ 23 апреля 2019

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

Я пытаюсь не получать сведения о решении для учащихсякогда переменная 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).

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

1 Ответ

1 голос
/ 24 апреля 2019

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

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

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

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

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

...