Получить все комбинации товара из разных таблиц
Подскажите пожалуйста каким образом можно получить и сопоставить данные в карточке товара. Мне необходимо вывести все доступные комбинации товара которые есть в таблице объединив их при этом в группы. Тех данных которых нет, просто не показывать.
Таблица продукта: 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 } ?>
