@vitaly63

Как сделать связанные мутации в GraphQL?

Добрых суток. Подскажите, как можно реализовать связанные мутации в GraphQL?

Для изучения GraphQL решил сделать для себя портфолио и как раз выучить новый инструмент. Особых сложностей не возникало до момента, когда мне понадобилось добавить запись в портфолио и привязанные к ней изображения.

Добавляемая запись в портфолио имеет связанные сущности, которые представлены в виде доп. изображений, у них есть заголовок, описание и пару тегов. Изображения, как и сама запись портфолио, находятся в разных таблицах и связаны по ID записи портфолио.
Вот тут и возникает вопрос: как правильно добавить запись с доп. изображениями в одной мутации и связать их, и как сделать это правильно?

Поискал по форумам и внятного мануала я так и не нашел. У меня есть пару идей как это сделать: использовать subscriptions или выполнять мутации через Promise. Предполагаю, что первый способ является верным, но все равно есть сомнения. Подскажите, как правильно нужно работать с подобными мутациями. Большое спасибо за внимание.

В разработке использую GraphQL, Apollo, Vue и Laravel.

Структура таблиц портфолио:

CREATE TABLE IF NOT EXISTS `portfolio_works` (
  `id` int(10) unsigned NOT NULL,
  `portfolio_id` int(10) unsigned NOT NULL,
  `title` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `image` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `description` text COLLATE utf8mb4_unicode_ci,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `portfolio_work_images` (
  `id` int(10) unsigned NOT NULL,
  `portfolio_id` int(10) unsigned NOT NULL,
  `portfolio_work_id` int(10) unsigned NOT NULL,
  `image` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `title` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  • Вопрос задан
  • 449 просмотров
Решения вопроса 1
SerafimArts
@SerafimArts
Senior Notepad Reader
Я так и не понял в чём проблема.

Схема
type Mutation {
    works: ProtfolioMutation!
}

type ProtfolioMutation {
    add(work: WorkInput!, images: [WorkImageInput!]! = []): Response
}

input WorkInput { title: String!, ... }


И запрос:

mutation {
    works { add(work: {title: "My new article"}, images: [...]) }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы