alestro
@alestro

Как можно провести рефакторинг вывода атрибутов?

В базе есть 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>

Как можно реализовать все это, что бы оно было более кашерно?
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы