gzhegow
@gzhegow
aka "ОбнимиБизнесмена"

Как организовать работу со связанными моделями в Eloquent при создании REST api?

Подскажите пожалуйста, как организовать работу?
Если я правильно понял из исходников и документации - у нас есть несколько видов связей

BelongsTo - Услуга находится в категории
HasOne/HasMany - Категория содержит одну/несколько услуг
BelongsToMany - Пользователь "находится в" нескольких ролях, связь через 3-ю таблицу
HasOneThrough/HasManyThrough - Роль содержит одну/несколько пользователей, связь через 3-ю таблицу
MorphOne/MorphMany - то же, что и HasOneThrough/HasManyThrough, только еще с условием, то есть сработает только для определенного значения в колонке
MorphToMany - взаимодействие четырех таблиц. Если MorphMany имелось в виду несколько один-ко многим в одной таблице, то это несколько MorphMany со списком в четвертой таблице. Лютая дичь
Pivot - Системная. Когда пробегаемся по списку пользователей, полученных из роли через связь, Пивот это таблица-связка
MorphTo - Системная. При работе с Morph связывает таблицу, чтобы MorphOne/MorphMany работали

Кроме того, что тут намудрено лютая туча этих связей, как оказалось в коде - они еще и не все умеют сохранять, как будто их делали только для считывания и фильтрации.

Например
belongsTo() - умеет associate()/dissociate() - по сути проставить айдишник на свое место, потом надо вызывать save(). Это вроде правильно.
hasOne/hasMany() - умеет только saveOne()/saveMany() - то есть она не устанавливает связь, а сразу пишет в базу, проставляя айдишники походу, но прикол в том, что если родительской модели нету, то и айдишники не проставятся, приехали, то есть она не меняет модель, она сразу пишет, потом вопросы с транзакциями, когда хочешь сделать рекурсивное сохранение
belongsToMany() - умеет sync() и attach(), аттач - в связанной таблице добавить запись даже если есть, detach() - удалить записи по списку, sync() - удалить лишнее и добавить которых не было. Причем делает это сразу в базе данных. А значит её тоже нужно вызывать в сервисе, понятия типа "построить модель со связями по ДТО" здесь нету походу.

остальные связи и вовсе не умеют, мне кажется, сохранять, а только считывать - там есть какие-то наброски по сохранению, но они не проставляют внешних ключей, а тупо срабатывают как будто я на самой модели вызвал save().

Я сначала хотел переписать метод push() который рекурсивно сохраняет модель и её связи, но поскольку связи работают черт его разбери как - это почти не имеет смысла.

===

Я почему спрашиваю... Если я пытаюсь сделать RestController которому какую модель не дай - он умеет CRUD + еще немножко, то мне нужно формирование модели с которой я работаю, а потом её сохранение в транзакции. Тут же получается всё заточено под то, что каждой модели нужно писать 5 экшенов контроллера и в каждом экшене вызывать собственную логику сохранения, которая написана чуть ли не на `for`ах.

Я правильно понял, или есть элегантный способ с этим взлетать?
  • Вопрос задан
  • 490 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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