我有一个包含以下列的数据透视表:
product_id
product_attribute_id
product_attribute_value_id
产品可以有许多属性,并且通过此属性有许多AttributeValues。
例如,属性可以是Color,其具有红色,蓝色,绿色和黄色作为AttributeValues。
但是,T恤产品可能具有“颜色属性”,但只选择“红色”和“蓝色”作为“属性值”。
我要做的是,基于此数据透视表,根据特定的产品ID获取所有属性和属性值。
我已经尝试过使用hasManyDeep包(https://github.com/staudenmeir/eloquent-has-many-deep),这让我得到了AttributeValues的集合,但不是我需要的格式。
该包给了我一个AttributeValues数组,每个都有Attribute关系。我需要的是一个属性数组,每个属性都有AttributeValues。
这是我到目前为止尝试使用的包:
return $this->hasManyDeep(
ProductAttributeValue::class,
[ProductOptionValue::class, ProductAttribute::class],
['product_id', 'id', 'product_attribute_id'],
['id', 'product_attribute_id', 'id'])
->whereColumn('product_attribute_values.id', '=', 'product_product_option_values.product_attribute_value_id')
->withIntermediate(ProductAttribute::class, ['*'], 'attribute');
编辑
然后我尝试切换查询,以便我首先获得ProductAttribute,因为@JonasStaudenmeir建议,但这不能正常工作。
return $this->hasManyDeep(
ProductAttribute::class,
[ProductOptionValue::class, ProductAttributeValue::class],
['product_id', 'id', 'id'],
['id', 'product_attribute_value_id', 'product_attribute_id'])
->whereColumn('product_attributes.id', '=', 'product_product_option_values.product_attribute_id')
->withIntermediate(ProductAttributeValue::class, ['*'], 'attribute');
有一种简单的方法可以获得所需的结果,而无需调用许多方法。
你可以建立一个正常的关系(hasOne / hasMany)并通过它自己的关系调用关系,因为关系将被连接。所以,假设您想要获得产品的价值,您可以通过所有产品$product->attribute
循环,然后您可以调用产品的价值$attribute->product_attribute_value->{value you need to have}
希望这可以帮助。祝好运