Как передать список или массив объектов в мутацию 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"
  }
}

Надеюсь, это поможет!

Другие вопросы по тегам