Для того, чтоб описать данные взаимоотношения в Laravel мы можем создать одну миграцию таблицы product, описать у неё все возможные свойства, что упоминаются в типах (класс, тип, артикул, ширина, высота, материал, огнеупорное ли, покрыты ли лаком), после чего создавать модели необходимых изделий, сохраняя требуемое нам наследование, но тут вопрос - как, например, указать для модели, при работе с общей таблицей (где хранятся вообще все продукты) возвращать только те, у которых указан, например, класс = (int) 2?
Вы Собираетесь хранить довольно много лишних, пустых ячеек и создавать вагон ненужных моделей. Не делайте так. Продукты делятся не на 2 класса, а на 2 типа. А тип(Окна пластиковые, Окна деревянные) - это одно из свойств продукта(материал).
1. Одна таблица для продуктов, где храните артикул и обязательные поля для всех продуктов.
2. Одна таблица для свойств продуктов, где храните все свойства для продуктов.
3. Связь многие ко многим расскажет к какому продукту какое свойство относится. Это позволит гибко добавлять свойства и прикреплять их к продуктам без вмешательства программиста.
4. Одна таблица - одна модель. Можно заморочится и с ДМ и с репозиториями и т.д. но если по простому, то одна таблица - одна модель. Свзяывайте их реляциями.