В базе есть 4 таблицы. Первая - attributes_group, содержит поля: id,name,sort_order. Вторая - attributes(id, name, attributes_groud_id(foregin key для attributes_group.id, sort_order). Третья - attributes_value(id,int,str,attributes_id(foregin key для attributes.id)). Четвертая - products_attributes(id,products_id(fk для products.id), attributes_id(fk для attributes.id)).
Так же есть вот такой класс:
class Attributes{
private $db;
public $group;
public $name;
public $value;
public function __construct(\core\Database $db){
$this->db=$db;
}
public function getProductsAttributes($pid){
$sth=$this->db->Q
(
[
'sql'=>'SELECT id,name FROM attributes_group as ag WHERE ag.id IN (SELECT a.attributes_group_id FROM attributes as a join products_attributes as pa on a.id=pa.attributes_id where pa.products_id =?) order by sort_order',
'bind'=>
[
$pid
]
]
);
while($row=$sth->fetch(\PDO::FETCH_ASSOC)){
$this->group[$row['id']]=$row['name'];
}
$sth=$this->db->Q
(
[
'sql'=>'select name, attributes_group_id as id, `int`,str from attributes as a join products_attributes as pa on pa.attributes_id = a.id join attributes_value as av on av.attributes_id = a.id where pa.products_id = ? order by sort_order',
'bind'=>
[
$pid
]
]
);
while($row=$sth->fetch(\PDO::FETCH_ASSOC)){
$this->name[$row['id']][]=$row['name'];
empty($row['int'])?$this->value[$row['id']][]=$row['str']:$this->value[$row['id']][]=$row['int'].' '.$row['str'];
}
return $this;
}
}
Два запроса к базе делаю, для возможности сортировать группы и атрибуты соответственно.
В итоге получаю объект с атрибутами товара и вывожу примерно следующим образом:
<table class="table table-bordered">
<?php foreach($a->group as $key=>$value){?>
<tr>
<th><?=$value?></th>
</tr>
<tr>
<?php foreach($a->name[$key] as $key2=>$value2){?>
<td width="200"><?=$value2?></td>
<td><?=$a->value[$key][$key2]?></td>
</tr>
<? } }?>
</table>
Как можно реализовать все это, что бы оно было более кашерно?