Иерархия моделей в Laravel? Доброго времени суток, %username%!
Смотри какая штука. Ответ на вопрос, описанный ниже, наверняка лежит на поверхности, но что-то никак не удается его сформулировать.
У нас есть абстрактная фабрика, которая выпускает продукцию. Абсолютно вся продукция обладает таким свойством как артикул. Кроме того, вся продукция делится на два класса:ДвериТип: Двери межкомнатные (свойства: материал, ширина, высота, цвет)Тип: Двери входные (свойства: материал, ширина, высота, огнеупорность)ОкнаТип: Окна пластиковые (свойства: материал, ширина, высота, цвет)Тип: Окна деревянные (свойства: материал, ширина, высота, покрыты ли лаком)
Для того, чтоб описать данные взаимоотношения в Laravel мы можем создать одну миграцию таблицы product, описать у неё все возможные свойства, что упоминаются в типах (класс, тип, артикул, ширина, высота, материал, огнеупорное ли, покрыты ли лаком), после чего создавать модели необходимых изделий, сохраняя требуемое нам наследование, но тут вопрос - как, например, указать для модели, при работе с общей таблицей (где хранятся вообще все продукты) возвращать только те, у которых указан, например, класс = (int) 2?
Более того, если мне необходимо вернуть все окна - я хочу просто дернуть модель /App/Models/Products/Doors и получить коллекцию вообще всех дверей, а если дерну /App/Models/Products/Doors/Interior - то только межкомнатные двери.
В общем - как лучше в таком случае организовать eloquent? Для каждого изделия создавать свою таблицу, но как тогда включать её во все "родительские" модели?
Или если всю продукцию хранить в одной, а при добавлении нового изделия (с новым свойством, к примеру) - просто писать миграцию на добавление поля? Но как тогда заставить "родительские" модели возвращать свеже-добавленные, а конкретную модель добавленного изделия - только её?
Или лучше ключевые свойства, такие как класс и тип вынести в отдельные таблицы, и связать их hasMany/hasOne?
Подскажите, пожалуйста.

21 Авг 2019 в 07:02
260 +1
1
Ответы
1

В данном случае, для организации иерархии моделей в Laravel, рекомендуется использовать полиморфные отношения.

Вы можете создать модель Product, где будут храниться все продукты, и связать её с моделями-наследниками (например, Doors и Windows) через полиморфные отношения.

Для этого вы можете создать таблицу productable, где будет храниться тип продукта (дверь, окно), и связывать каждую модель с этой таблицей через полиморфную связь.

Таким образом, при добавлении новых типов продукции, вам не придется изменять структуру базы данных или писать новые миграции таблицы product. Просто создайте новую модель и свяжите её с таблицей productable.

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

$doors = Product::where('productable_type', 'App\Models\Products\Doors')->get();
$interiorDoors = Product::where('productable_type', 'App\Models\Products\Doors\Interior')->get();

Таким образом, вы сможете организовать иерархию моделей в Laravel с помощью полиморфных отношений, добавлять новые типы продукции без изменения структуры базы данных и легко получать нужные данные в зависимости от класса или типа продукции.

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир