Как реализовать и хранить наследумые объекты/модели?

Читаю сейчас литературу по шаблонам проектирования. И рассматривается пример:

Есть класс Product, от него наследуются BookProduct и CdProduct и они отличаются некоторыми методами и свойствами.
У BookProduct есть свойства numPages и метод getNumberOfPages, а у CdProduct playLenght и getPlayLenght.

И что то не могу понять как это реализовать в рамках Eloquent. Это модель Product должна быть или все же 2 модели BookProduct и CdProduct, следовательно тогда это 2 таблицы?
А если типов продуктов будет много, это для каждого типа по таблице нужно создавать? С другой стороны если одна таблица, тогда получается слишком много колонок будет. А если начнется дальше наследование от BookProduct и CdProduct?

В общем на бумаге все выглядит хорошо и красиво, а как хочу на практике в Laravel поковыряться, так ступор.
  • Вопрос задан
  • 263 просмотра
Пригласить эксперта
Ответы на вопрос 4
solotony
@solotony
покоряю пик Балмера
я делаю так
вначале класс MyProduct наследую от базовой Model в котором реализована общая логика
и уже от него отнаследованы BookProduct CdProduct соответственно никаких объектов MyProduct никогда не существует, таблицы для нее нет

либо общую логику можно сделать трейтом, но мне кажется правильнее здесь делать именно наследование
Ответ написан
Комментировать
palkan_karabov
@palkan_karabov
PressF1
Я бы сделал так:
Таблицы: cds, books, products. Добавил бы к ним связи 1к1.
Соответственно модели: Cd, Book, Product. У Cd и Book связь belongsTo к Product
Ответ написан
Комментировать
@cybersnail
Зачем что-то наследовать? Просто нужно реализовать дополнительные поля для товаров, посмотрите как все магазины написаны, они позволяют создавать любые товары с любыми дополнительными опциями.
Ответ написан
dlnsk
@dlnsk
ПК Партнер 01.01 -> ПК Поиск -> IBM PC
Ваш вопрос - калька с уже заданного ранее. Реально они появляются примерно раз в месяц... ;)
Мой ответ на него: Как лучше всего реализовать подобную архитектуру?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы