Привет, у нас проблема с поиском лучшего способа подключения
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
}
}
Это в основном означает:
Проблемы:
Несмотря на то, что GraphQL позволяет определить вложенную структуру, у нас есть проблема с представлением такой структуры в Eloquent ORM.
Прямо сейчас мы разделяем представленные данные на два отдельных набора. Один набор, состоящий из данных, которые необходимо СОЗДАТЬ, а второй набор содержит данные, которые необходимо ОБНОВИТЬ. Для этого у нас есть рекурсивный метод, который перебирает упомянутую выше структуру данных и обрабатывает (создает / обновляет) записи в контексте отношения к его родителю.
Для выполнения обновлений нам нужно выбрать все модели, для которых у нас есть идентификаторы (в структуре данных). Создание модели с использованием конструктора с указанным идентификатором не обновляет запись, но создает новую. Создание новой модели с помощью метода createOrUpdate также выполняет запрос на выборку для базы данных.
Другая проблема, с которой мы столкнулись, связана с авторизацией пользователей для каждого вложенного «ресурса» отдельно.
Например, нам нужно применить некоторую логику авторизации для обновления продукта (обновлять его может только создатель продукта).
Мы не хотим использовать такую логику в нашем рекурсивном методе, потому что мы думаем, что он там не принадлежит.
Мы могли бы делегировать такую логику в другое место, но тогда нам пришлось бы снова извлечь ее из базы данных.
Наши проблемы / вопросы:
Должны ли мы использовать какой-то другой подход?
Должны ли мы использовать вложенные объекты со свойствами типа create: [], update: [], delete: []
вместо массивов?
Как заполнить такую структуру данных для моделей Eloquent отношениями?
Можно ли вообще вкладывать такие resources
в GraphQL
? Или это анти-паттерн?
Как насчет разделения всех вложенных "ресурсов" на отдельные мутации?