Я пытаюсь оптимизировать запрос, выполняемый некоторыми из моих компонентов реакции, которые являются общими для всего приложения, такими как компоненты нижнего колонтитула и верхнего колонтитула.
Я пытаюсь не получать информацию о решении для учащихся, когда переменная 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).
Но кажется, что директивы применяются только к полям, а не ко всем запросам. Поэтому мне интересно, возможно ли то, что я хочу сделать, потому что то, как я это написал, неверно.
FWIW, я вижу отсутствующую закрывающую скобку, но это может быть просто опечатка здесь, а не в вашем коде.
Когда я пытаюсь выполнить это, запрос зависает и в конечном итоге истекает время ожидания. Я использую не свой собственный сервер graphql, а сторонний, поэтому, возможно, такие вещи не реализованы на их бэкэнде. Но я не сильно отлаживал, так как думал, что делаю это неправильно, я посмотрю глубже. Спасибо! (и опечатка в том, что я удалил здесь много шума, чтобы сосредоточиться на том, что важно)
И действительно, ты был прав. Запрос хорошо работает на graphiql, но мой исходный код дал сбой, я думаю, он был либо неправильно переведен, либо я допустил ошибку в коде. В любом случае, это правильный способ получения необязательных полей!
Это действительно была глупая ошибка в моем коде (не предоставление новой переменной для всех вызовов, использующих этот запрос). Если вы хотите написать правильный ответ, я приму его и закрою вопрос :)


Любое поле в документе GraphQL может быть явно включены с помощью директивы @include или явно не входит с помощью директивы @skip. Директива должна быть указана после имени поля и аргументов, но перед набором выбора поля, если он есть, как показано в вашем вопросе:
studentSolutionRelationships(where:{
#...input fields omitted for brevity
}) @include(if: $fetchInstitution) {
status
}
Директива принимает один аргумент (if), который должен быть значением Boolean. Это значение может быть литералом (например, true или false) или переменной типа Boolean. GraphQL не предоставляет способа оценки выражений — любая условная логика должна находиться в клиентском коде и использоваться для определения значения переменной, переданной в аргумент if.
Директивы могут применяться к полю Любые в документе, в том числе к корневым, таким как studentSolutionRelationships и organisation в вопросе. На самом деле вы можете исключить все корневые поля с помощью этих директив — просто имейте в виду, что в таком случае запрос все равно будет выполняться и просто вернет пустой объект.
Другими словами, ваш подход здесь правильный. Если запрос не выполняется, это происходит из-за несвязанной проблемы.
studentSolutionRelationshipsиorganisationпо-прежнему являются полями, просто они являются полями в корневом типе операции запроса. В вашем подходе нет ничего неправильного. Когда вы говорите, что это «недействительно», что вы имеете в виду? Какую ошибку вы видите?