Получить все комбинации товара из разных таблиц

Подскажите пожалуйста каким образом можно получить и сопоставить данные в карточке товара. Мне необходимо вывести все доступные комбинации товара которые есть в таблице объединив их при этом в группы. Тех данных которых нет, просто не показывать.

Таблица продукта: Products

Таблица группы атрибутов: Products_attributes_group

Есть таблицы атрибутов которые создаются динамически с присваиванием имени: Products_attributes_***

Таблица атрибутов с данными: Products_attributes (в ней также динамически создаются столбцы с именем атрибутов при добавлении)

У меня получилось вывести все, но с целой кучей foreach, постоянными возвращениями (запросами) в таблицы. В целом думаю неправильно вышло и очень много кода. В начале получаю данные всех групп, далее получаю данные всех атрибутов, после по id атрибута делаю выборку из записей атрибута товаров, потом снова в атрибуты для получения имени... в общем целая история.

Ниже подробно указаны все значения таблиц и скриншот того что необходимо получить в итоге.

Если не сложно покажите простой способ как это реализовать. Спасибо.

Products

id  product_name    description
1   Кровать Браво   Браво
2   Тумба ТВ        ТВ-1

Products_attributes

id  product_id  size_id color_id  material_id   sku   qty    price
1      1         2        1            1      Браво1   5      500
2      1         2        2            1      Браво2   3      500
3      1         3        2            1      Браво3   2      700   

        

Products_attributes_size

id  size_value  group_id
1     90x140       1
2     140x200      1
3     160x200      1

Products_attributes_color

id  size_value  group_id
1     Сонома       2
2     Венге        2
3     Ясень        2

Products_attributes_material

id  material_value  group_id
1       ЛДСП           3
2        МДФ           3
3       Метал          3

Products_attributes_group

id  group_value  group_type
1     Размер       size
2      Цвет        color
3     Материал    material

Схема таблиц введите сюда описание изображения

Что необходимо получить в итоге необходимо на странице товара вывод таких комбинаций

UPD Получилось сократить и упростить код 1 джоином.

function get_catalog_attribute($product_id) {
    $query = $this->db->get('pt_catalog_attribute_group')->result();
    $result = array();
    
    foreach ($query as $q) {
        $result[] = array( 
        'group' => $q->group_value,
        'group_lat' => $q->group_name,
        'attribute' => $this->get_catalog_attribute_value($q->group_name, $product_id)
        );
    }
    
    return $result;
}

function get_catalog_attribute_value($name, $product_id) {
    $atrid = 'pt_catalog_attribute_'.$name.'.id';
    $atrid_s = 'pt_catalog_attribute.'.$name.'_attr';
    
    $this->db->where('product_id', $product_id);
    
    $this->db->join("pt_catalog_attribute", "$atrid_s = $atrid", 'INNER');
    $query = $this->db->get('pt_catalog_attribute_'.$name)->result();
    
    return $query;
}

вывод на странице товара

<?php foreach($combinations as $key => $c){  ?>
    <div class="col-md-6"><strong><?php  if (!empty($c['attribute'])) {echo $c['group'];} ?></strong></div>
    <fieldset id="combination<?php echo $key;?>">
        <?php $values = []; foreach($c['attribute'] as $key => $at) { ?>
        <div class="col-md-6">
            <label class="pointer">
                <?php if(! in_array($at->value, $values)) { $values[] = $at->value; ?>
                    <input type="radio" name="combo_<?php echo $at->group_id;?>" data-group="<?php  echo $c['group_lat']; ?>" value="<?php echo $at->id;?>"> <?php echo $at->value; ?>
                <?php } ?>
            </label>
        </div>
        <?php } ?>
    </fieldset>
<?php } ?>

Ответы (0 шт):