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

21 Авг 2019 в 07:02
281 +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 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир