GraphQL - как подойти к сохранению вложенных данных - PullRequest
0 голосов
/ 30 октября 2018

Привет, у нас проблема с поиском лучшего способа подключения

GraphQL, Rebing GraphQL, Laravel and Eloquent.

Основная проблема связана с мутацией для вложенных resources.

Например: Manufacturer->Brand->Product

Пока что мы попробовали:

mutation {
  addManufacturer(
      address: "New York"
      brands: [
          {
              name: "Brand A"
              products: [
                  {
                      name: "Model 1"
                  }
                  {
                      name: "Model 2"
                  }
              ]
          }
          {
              name: "Brand B"
              products: [
                  {
                      name: "Model 3"
                  }
                  {
                      name: "Model 4"
                  }
              ]
          }
      ]
  ) {
      address
  }
}

mutation {
  updateManufacturer(
      id: 1
      address: "LA"
      brands: [
          {
              id: 1
              name: "Brand Z"
              products: [
                  {
                      id: 1
                      name: "Model 10"
                  }
                  {
                      name: "Model 11"
                  }
              ]
          }
      ]
  ) {
      address
  }
}

Это в основном означает:

  • Мутация addManufacturer только о создании новых записей в БД

  • updateManufacturer мутация об обновлении записей с существующим идентификатором и создании записей без идентификатора.

Проблемы:

  • Несмотря на то, что GraphQL позволяет определить вложенную структуру, у нас есть проблема с представлением такой структуры в Eloquent ORM. Прямо сейчас мы разделяем представленные данные на два отдельных набора. Один набор, состоящий из данных, которые необходимо СОЗДАТЬ, а второй набор содержит данные, которые необходимо ОБНОВИТЬ. Для этого у нас есть рекурсивный метод, который перебирает упомянутую выше структуру данных и обрабатывает (создает / обновляет) записи в контексте отношения к его родителю.

  • Для выполнения обновлений нам нужно выбрать все модели, для которых у нас есть идентификаторы (в структуре данных). Создание модели с использованием конструктора с указанным идентификатором не обновляет запись, но создает новую. Создание новой модели с помощью метода createOrUpdate также выполняет запрос на выборку для базы данных.

  • Другая проблема, с которой мы столкнулись, связана с авторизацией пользователей для каждого вложенного «ресурса» отдельно. Например, нам нужно применить некоторую логику авторизации для обновления продукта (обновлять его может только создатель продукта). Мы не хотим использовать такую ​​логику в нашем рекурсивном методе, потому что мы думаем, что он там не принадлежит. Мы могли бы делегировать такую ​​логику в другое место, но тогда нам пришлось бы снова извлечь ее из базы данных.

Наши проблемы / вопросы:

  • Должны ли мы использовать какой-то другой подход?

  • Должны ли мы использовать вложенные объекты со свойствами типа create: [], update: [], delete: [] вместо массивов?

  • Как заполнить такую ​​структуру данных для моделей Eloquent отношениями?

  • Можно ли вообще вкладывать такие resources в GraphQL? Или это анти-паттерн?

  • Как насчет разделения всех вложенных "ресурсов" на отдельные мутации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...