Как передать список или массив объектов в мутацию GraphQL, предназначенную для обновления одного объекта?
Я использую https://scaphold.io/ для создания серверной части небольшого приложения, над которым я работаю, и столкнулся с проблемой, пытаясь обновить несколько элементов в одном запросе на мутацию.
В Scaphold при создании нового типа создаются мутации для общих операций: создание, обновление и удаление.
Вы не можете переопределить схему для этих мутаций или их типов ввода. В типе модели я работаю (card
), Я получаю эти мутации из коробки:
createCard(input: CreateCardInput!): CreateCardPayload
updateCard(input: UpdateCardInput!): UpdateCardPayload
deleteCard(input: DeleteCardInput!): DeleteCardPayload
updateCardInput
Тип определяет следующие поля:
listId: ID
description: Text
name: String
order: Int
id: ID!
clientMutationId: String
Что я могу сделать: обновить одну карту
С этим я знаю, как определить мутацию, которая обновляет order
для одной карты:
mutation updateCardOrder($card: UpdateCardInput!) {
updateCard(input: $card) {
changedCard {
id
order
}
}
}
Переменные:
{
"card": {
"id": "Q2FyZDo4MzA=",
"order": "1"
}
}
Что я хочу сделать: обновить несколько карт в одной мутации
Я получил несколько указателей, чтобы использовать список карт ([card]
), но я не могу понять, как заставить это работать.
В идеале что-то вроде:
mutation updateCardOrder($cards: UpdateCardInput!) {
updateCard(input: $card) {
changedCard {
id
order
}
}
}
И передать несколько карт в качестве переменной, например:
{
"cards": [
{
"id": "Q2FyZDo4Mjk=",
"order": "1"
},
{
"id": "Q2FyZDo4MzA=",
"order": "2"
}
]
}
Когда я пытаюсь это сделать, я получаю сообщение об ошибке:
{
"errors": [
{
"message": "Variable \"$cards\" of type \"[UpdateCardInput!]\" used in position expecting type \"UpdateCardInput!\".",
"locations": [
{
"line": 1,
"column": 32
},
{
"line": 2,
"column": 27
}
],
"name": "GraphQLError"
}
]
}
Итак... как правильно думать об этом в GraphQL, учитывая, что я не могу изменить тип ввода или схему мутаций в Scaphold? Это вообще возможно?
1 ответ
Поскольку вы хотите запустить несколько мутаций в одном запросе, вы можете использовать псевдонимы GraphQL для этого. Более подробная информация здесь: https://github.com/mugli/learning-graphql/blob/master/3.%20Querying%20with%20Field%20Aliases%20and%20Fragments.md
По сути, вы можете запустить мутацию следующим образом:
mutation updateCardOrder($card1: UpdateCardInput!, $card2: UpdateCardInput!, $card3: UpdateCardInput!) {
update1: updateCard(input: $card1) {
changedCard {
id
order
}
}
update2: updateCard(input: $card2) {
changedCard {
id
order
}
}
update3: updateCard(input: $card3) {
changedCard {
id
order
}
}
}
И переменные будут выглядеть примерно так:
{
"card1": {
"id": "Q2FyZDo4Mjk=",
"order": "1"
},
"card2": {
"id": "Q2FyZDo4MzA=",
"order": "2"
},
"card3": {
"id": "Q2FyZDo4MzA=",
"order": "3"
}
}
Надеюсь, это поможет!