Laravel Pivot表在3个表之间的关系

时间:2019-04-08 07:46:49

标签: laravel pivot-table has-many

我有一个数据透视表,其中包含以下列:

product_id
product_attribute_id
product_attribute_value_id

一个产品可以有很多属性,通过这个属性可以有很多AttributeValues。

例如,一个属性可以是颜色,它具有红色,蓝色,绿色和黄色作为AttributeValues。

但是,T恤产品可以具有颜色属性,但是只有红色和蓝色被选为属性值。

我想做的是,基于此数据透视表,根据特定的产品ID获取所有属性和AttributeValue。

我尝试使用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');

编辑

然后我尝试切换查询,以便首先按照@JonasStaudenmeir的建议获取ProductAttribute,但这不能正常工作。

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');

1 个答案:

答案 0 :(得分:0)

有一种无需调用许多方法即可获得所需结果的简便方法。

您可以建立一个普通关系(hasOne / hasMany)并通过自身的关系调用该关系,因为该关系将被连接。因此,假设您要获得产品的价值,可以遍历所有产品$product->attribute,然后可以将产品的价值称为$attribute->product_attribute_value->{value you need to have}

希望这会有所帮助。祝你好运