@flammerman
Web Developer / И фронт и сервер

Laravel Eloquent как правильно организовать форму добавления товара со множеством атрибутов и опций?

Приветствую всех

Гуглю, гуглю уже много часов вместе со зрительным парсингом ютьюба. Не могу найти информацию как можно организовать достаточно сложную форму добавления и редактирования сущности "товар", которая имеет много разных реляций. Везде одни простейшие примеры с админкой аля Voyager и формой для одной таблицы в которую впиханы все атрибуты товара вместе с изображениями. 1 раз видел с опциями (просто еще одна табличка с фиксированными атрибутами в виде колонок таблицы color, price итд)

Возник ступор. Опыта очень мало, но стараюсь делать максимально правильно, пускай даже медленно и использовать фичи ларавела, а не серверные переменные $_POST вместо передачи Request. =) чтоб было понятно о чем я.

Есть стандартная модель БД EAV (некоторые колонки удалены для приятного восприятия):

Product (id, title, group_id, is_published[1,0], timestamps)
Attribute (id, type[select,checkbox,text], name)
product_attributes (id, product_id, attribute_id, value) // pivot_table

Далее группы товаров (тоже самое что и тип товаров во многих ЦМС или просто группы характеристик привязанных к товару) Один атрибут может быть во многих группах

Groups (id, name) // id = 1; name = кольца
group_attributes (attribute_id, group_id)

Опции уже тут не буду расписывать, там еще 2 таблицы с одной pivot

В общем по идее ничего лишнего, но как это все одновременно добавлять нажав на кнопку сохранить не представляю. Ведь много зависимостей, например не знаем какие будут атрибуты у товара не выбрав пачку атрибутов или привязав группу к товару, по другому. Пускай группы можно добавить заранее. Смену группы в товаре делать не желательно, ибо тогда надо затирать все характеристики, группа сменится и значения вылетевших характеристик останутся (при update) при добавлении в принципе пофиг на это. И куча такого рода нюансов. я все их опишу, но по идее должен быть мб какой-то центр управления такой формой, или все пихать в метод контроллера

Есть модели Attribute, Product, Group. Не знаю как сделать правильно все это. Может есть у кого пример таких форм. Да и еще не знаю стоит ли всю форму отправлять в один роут контроллера, или может надо как-то перераспределить задачи (атомарность и все такое). Реляции на все есть. Может какой-то интерфейс надо писать на такое.
  • Вопрос задан
  • 884 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Yan-s
но как это все одновременно добавлять нажав на кнопку сохранить не представляю. Ведь много зависимостей, например не знаем какие будут атрибуты у товара не выбрав пачку атрибутов или привязав группу к товару, по другому

Что то не улавливается проблема. Попробуйте добавить более последовательный пример с расписанными действиями и моментом, когда у вас возникает сложность.

Попробую приблизительно разобраться. Есть у нас товары их атрибуты и группы атрибутов.
Значит у нас должна быть
- форма для создания групп атрибутов (просто создается именованная группа в которую можно поместить атрибут,
- форма для создания атрибутов (где мы можем добавить атрибут и выбрать для него группу из существующих)
- и форма для добавления товаров (где мы можем выбрать атрибуты из существующих)

Вроде никаких проблем. Если требуется иметь возможность создать новый атрибут из формы добавления продукта, то это делается AJAXом. Есть кнопка "создать новый атрибут" которая, например, открывает в модалке форму создания атрибута.

Соответственно контроллер создания продукта отвечает только за создание продукта, атрибуты уже должны быть все созданы.

PS
Кстати, если вы подобное видели в каких то CSM, то будет полезно разобраться как это решено было там.
Ответ написан
pLavrenov
@pLavrenov
Разработка сайтов
В документации Laravel есть раздел "Отношения"
https://laravel.ru/docs/v5/eloquent-relationships

В нем понятно расписано как создавать отношения и как добавлять через них записи.

В данном случае:
пример №1 это многие к многим (ManyToMany).
пример №2 это один ко многим (OneToMany)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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