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