У меня есть сводная таблица со следующими столбцами:
product_id
product_attribute_id
product_attribute_value_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');
EDIT
Затем я попытался переключить запрос, чтобы я сначала получил 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');