Я создаю сайт электронной коммерции в Laravel. У меня есть таблица attribute , заполненная информацией об атрибутах, такой как «Цвет» и «Размер». Таблица ** attribute_values содержит все значения атрибутов, такие как «красный», «синий» и «XXL».
Поскольку я хочу повторно использовать атрибуты, я не создаю новый набор атрибутов для продукта, но я связываю все значения атрибутов с продуктами с помощью сводной таблицы attribute_value_product .
Структура отношения модели:
Attribute -> hasMany -> AttributeValue
Product -> belongsToMany -> AttributeValue
Таблицы следующие:
products
--------------------------------
| id | name | price |
--------------------------------
| 1 | Example product | 200 |
--------------------------------
attributes
--------------
| id | name |
--------------
| 1 | Color |
--------------
attribute_values
-----------------------------
| id | attribute_id | value |
-----------------------------
| 1 | 1 | Red |
-----------------------------
| 2 | 1 | Blue |
-----------------------------
attribute_value_product
----------------------------------------
| id | attribute_value_id | product_id |
----------------------------------------
| 1 | 1 | 1 |
----------------------------------------
| 2 | 2 | 1 |
----------------------------------------
Код контроллера (немного упрощенный) выглядит следующим образом:
public function show($id) {
$product = Product::where('id', $id)
->with('attributeValues.attribute')
->first();
return view('product')->withProduct($product);
}
результат JSON при возврате переменной $ product из контроллера выглядит так:
{
id: 1,
name: "Example product",
price: 200,
attribute_values: [
{
id: 1,
attribute_id: 1,
value: "Red",
attribute: {
id: 1,
name: "Color",
}
},
{
id: 2,
attribute_id: 1,
value: "Blue",
attribute: {
id: 1,
name: "Color",
}
}
]
}
Как видите, это немного «противно». Когда я получаю множество атрибутов для множества продуктов, атрибут get загружается для каждого значения. Когда мне нужно только один раз на самом деле. Кроме того, способ структурирования данных, на мой взгляд, «неправильный».
Предпочтительный вывод, который я хотел бы видеть:
{
id: 1,
name: "Example product",
price: 200,
attributes: [
{
id: 1,
name: "Color",
values: [
{
id: 1,
attribute_id: 1,
value: "Blue",
},
{
id: 2,
attribute_id: 1,
value: "Red",
}
]
},
]
}
Таким образом, значения будут загружаться для каждого атрибута продукта , Есть ли (Laravel) способ структурировать отношения таким образом, чтобы я мог получать данные в последнем формате, сохраняя при этом схему базы данных, которая у меня есть?
Я бы не стал л oop на все предметы каждый раз, когда мне нужно получить атрибуты. Особенно при запросе партий товаров с некоторыми другими отношениями.