Таблица oc_product_attribute
Таблица oc_product_attribute является связующей таблицей между товарами (oc_product) и их атрибутами (oc_attribute). Она хранит конкретные значения атрибутов для каждого товара на разных языках.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
product_id |
int |
Идентификатор товара. Внешний ключ, ссылается на oc_product. Часть первичного ключа.
|
attribute_id |
int |
Идентификатор атрибута. Внешний ключ, ссылается на oc_attribute. Часть первичного ключа.
|
language_id |
int |
Идентификатор языка. Внешний ключ, ссылается на oc_language. Часть первичного ключа. Позволяет хранить разные текстовые значения атрибутов для каждого языка.
|
text |
text |
Текстовое значение атрибута для конкретного товара и языка. Например, для атрибута "Цвет" это может быть "Красный", а для атрибута "Размер" - "XL". |
Как это работает
Администратор магазина сначала создает атрибуты в разделе "Каталог → Атрибуты". Каждый атрибут имеет название (например, "Производитель", "Материал", "Размер") и группу атрибутов.
При редактировании товара (или при его создании) на вкладке "Атрибуты" можно выбрать нужный атрибут из выпадающего списка и указать его значение для товара. Это значение и записывается в поле text.
Так как OpenCart - мультиязычная система, для каждого языка можно указать свое значение атрибута. Именно поэтому language_id является частью первичного ключа. Если магазин работает на двух языках, для одного и того же атрибута товара в этой таблице будет две записи с разными language_id и переведенным текстом в поле text.
Первичный ключ таблицы составной и состоит из трех полей: product_id, attribute_id и language_id. Это гарантирует, что для одного товара нельзя создать две одинаковые записи для одного атрибута на одном языке.
На фронтенде, на странице товара, значения его атрибутов подгружаются из этой таблицы с учетом текущего языка посетителя.
Пример SQL-запроса
Получить все атрибуты для товара с ID 42 на русском языке (language_id = 1) можно следующим запросом:
SELECT
a.name as attribute_name,
agd.name as attribute_group_name,
pa.text as attribute_value
FROM oc_product_attribute pa
LEFT JOIN oc_attribute a ON (pa.attribute_id = a.attribute_id)
LEFT JOIN oc_attribute_description ad ON (a.attribute_id = ad.attribute_id AND ad.language_id = pa.language_id)
LEFT JOIN oc_attribute_group ag ON (a.attribute_group_id = ag.attribute_group_id)
LEFT JOIN oc_attribute_group_description agd ON (ag.attribute_group_id = agd.attribute_group_id AND agd.language_id = pa.language_id)
WHERE pa.product_id = 42
AND pa.language_id = 1
ORDER BY ag.sort_order, a.sort_order;
Смотрите также
-
таблицу
oc_product,
которая содержит основные данные о товарах -
таблицу
oc_attribute,
которая хранит определения атрибутов -
таблицу
oc_attribute_description,
которая содержит многоязычные названия атрибутов -
таблицу
oc_attribute_group,
которая хранит группы для сортировки атрибутов