Laravel Pivot таблица отношений между 3 таблицами - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть сводная таблица со следующими столбцами:

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

1 Ответ

0 голосов
/ 09 апреля 2019

Существует простой способ получить нужный результат без вызова многих методов.

Вы можете создать нормальное отношение (hasOne / hasMany) и вызвать отношение через само отношение, потому что оно будет связано. Допустим, вы хотите получить значение продуктов, которые вы можете зациклить на всех продуктах $product->attribute, тогда вы можете назвать значение продукта $attribute->product_attribute_value->{value you need to have}

Надеюсь, это поможет. Удачи

...