Мне интересно, как использовать тип ввода и одно из его полей в качестве аргументов в одном и том же запросе GraphQL. Я думаю, что есть несколько правильных решений, но мне интересно, какие (если таковые имеются) являются лучшей практикой.
Рассмотрим следующий гипотетический запрос. Мы получаем игроков по местоположению и статусу, а также членов команды, которые находятся в одном месте, но поле member
имеет только аргумент location
:
input PlayerInput {
location: String!
status: Int!
}
query getPlayers($playerInput: PlayerInput) {
players(playerInput: $playerInput) {
name
team {
name
members(location: ???) { // <-- How to access playerInput.location?
name
}
}
}
}
Я могу придумать несколько способов решить это:
1. Измените запрос так, чтобы он принимал отдельные аргументы
query getPlayers($location: String!, $status: Int!) {
players(playerInput: { location: $location, status: $status }) {
name
team {
name
members(location: $location) {
name
}
}
}
}
2. Обновите схему так, чтобы members
принимал правильный тип ввода
query getPlayers($playerInput: PlayerInput) {
players(playerInput: $playerInput) {
name
team {
name
members(playerInput: $playerInput) { // <-- Requires changing schema
name
}
}
}
}
Это не кажется хорошим по нескольким причинам и сработало бы, только если у вас есть возможность обновить схему.
3. Передайте location
в качестве избыточного отдельного аргумента
query getPlayers($playerInput: PlayerInput, $location: String!) {
players(playerInput: $playerInput) {
name
team {
name
members(location: $location) {
name
}
}
}
}
Это выглядит нормально, просто при создании запроса есть некоторое дублирование:
const location = 'US';
const status = 1;
fetch({
query: getPlayersQuery,
variables: {
location,
playerInput: {
location,
status,
}
}
})...
Любой из этих предпочтительный способ сделать что-то вроде этого? Есть ли другие способы, которые я не рассмотрел?