#graphql #graphql-js
#graphql #graphql-js
Вопрос:
Я хотел бы определить следующие запросы
{
// return all individuals
individuals {
id
}
}
// return ONE individual by id
individuals(id:"123") {
id
}
}
обратите внимание, что имя запроса одно и то же, отличаются только параметры.
На сегодняшний день единственное решение, которое я нашел, — это определить разные имена запросов.
Как я могу определить полиморфные запросы? Возможно ли это вообще?
Комментарии:
1. Я не уверен, что вы подразумеваете здесь под «именем запроса» — вы имеете в виду имя поля в корневом типе запроса?
2. Это объясняется здесь graphql.org/learn/queries В приведенных выше примерах имя запроса — «individuals»
Ответ №1:
Поля, доступные в корне вашего запроса GraphQL, определены в схеме GraphQL как поля корневого типа запроса, обычно с простым именем Query
. Этот тип точно такой же, как и любой другой тип объекта GraphQL в схеме. Итак, этот вопрос можно сформулировать как:
Имеют ли поля GraphQL возможность возвращать разные результаты на основе переданных в аргументах или типах аргументов?
Короткий ответ «нет». Одним из важных свойств GraphQL является то, что конкретное поле всегда должно возвращать один и тот же тип; это означает, что поле, возвращающее массив, всегда должно возвращать массив, а поле, возвращающее тип объекта, всегда должно возвращать этот конкретный тип, независимо от передаваемых аргументов.
Однако есть несколько способов добиться аналогичных результатов, чтобы избежать необходимости создавать слишком много разных именованных полей:
- Поля GraphQL могут иметь необязательные аргументы. Так, например, если у вас есть поле с именем
individuals
, вы могли бы использовать необязательные аргументы для предоставления различных типов фильтров, например:individuals(search: "Dan")
илиindividuals(status: "admin")
, илиindividuals
(без аргументов) илиindividuals(status: "admin", search: "Dan")
(оба аргумента предоставляются сразу. - Поля GraphQL могут возвращать объединение нескольких типов объектов. Итак, если ваше поле может возвращать несколько разных типов данных, вы можете использовать объединение. Это представлено в примере SearchResult в документах: http://graphql.org/learn/schema/#union-types К сожалению, это здесь неприменимо, поскольку вы не можете объединить массив с типом объекта.
Однако во многих случаях вам потребуется создать несколько полей, поскольку в настоящее время в GraphQL нет перегрузки методов или полиморфизма.
Комментарии:
1. Для элемента с помощью
id
я возвращаю массив1
, безid
, array ofn
. Кажется, работает хорошо.