我正在使用Laravel 5.8进行电子商务,现在我正在尝试进行智能过滤。
我有 4 个表(产品、属性、attribute_values、product_attributes(。
产品
id name direction_id
----------------------------------
1 Product 1 1
2 Product 2 2
3 Product 3 1
4 Product 4 1
属性
id name
-------------------
1 HDD
2 RAM
attribute_values
id attribute_id value
------------------------------
1 1 1TB
2 1 500GB
3 2 8GB
4 2 32GB
product_attributes
id product_id value_id
---------------------------
1 1 1
2 1 3
3 2 1
4 2 4
5 3 1
6 4 4
现在我只想显示一个方向的产品属性和值。 例如 如果 direction_id = 1 我只想显示硬盘(1TB(,内存(8GB,32GB(。
任何想法如何制作这种过滤器并过滤产品。 我只提出了显示属性和值的解决方案。
对于属性
select distinct a.*
from products p
left join product_attributes pa
on pa.product_id = p.id
left join attribute_values v
on v.id = pa.value_id
left join attributes a
on a.id = v.attribute_id
where p.direction_id = 1
对于值
select distinct v.*
from products p
left join product_attributes pa
on pa.product_id = p.id
left join attribute_values v
on v.id = pa.value_id
where p.direction_id = 1
Laravel中的解决方案将实现关系,如下所示:
// class Product extends Model ('products' table)
public function attributeValues()
{
return $this->belongsToMany(AttributeValue::class, 'product_attributes', 'product_id', 'value_id');
}
// class AttributeValue extends Model ('attribute_values' table)
public function attribute()
{
return $this->belongsTo(Attribute::class, 'attribute_id', 'id');
}
// retrieve engine for direction '1':
$attributesValues = [];
Product::query()
->where(['direction' => 1])
->each(function(Product $product) use (&$attributesValues) {
$product->attributeValues()->each(function(AttributeValue $attributeValue) use (&$attributesValues) {
$attributesValues[$attributeValue->attribute->name][] = $attributeValue->value;
});
});
dd($attributesValues);