Здравствуйте. Подскажите, пожалуйста, следующее. В таблице oc_category_path три столбца: category_id, path_id и level. Что такое category_id мне понятно - это уникальный идентификатор категории. А вот следующие два (path_id и level) мне не понятно зачем нужны. Какой-то идентификатор пути и уровень :-) Кстати, без этой таблицы всё работает также как и с ней. Я не заметил разницы. Объясните, пожалуйста, непосвящённому :-)
тема · 3 437 просмотров · 5 ответов
Таблица: oc_category_path
Общие вопросы
Vlad написал(а): ↑http://forum.opencart-russia.ru/threads/kategorii-i-category_path-ili-parent_id.4344/
Спасибо за ответ, но в теме мне всё же не удалось уловить смысл столбцов path_id и level. Вот взгляните https://beta.ssm.cash/ В таблице os_category_path нет никаких данных в этом примере, я очистил таблицу. Почему тогда все переходы по категориям проходят без ошибок?
В основном это таблица используется только в админке
Не помню в какой версии она появилась, но ее суть - быстрое построение пути категории
Без вложенных запросов
Вот пример, этим запросом вы получите все Категории со всеми путями с именами
Или вот
Одним запросом получены все PATH категорий
Не помню в какой версии она появилась, но ее суть - быстрое построение пути категории
Без вложенных запросов
Вот пример, этим запросом вы получите все Категории со всеми путями с именами
code
SELECT cp.category_id AS category_id, GROUP_CONCAT(cd1.name ORDER BY cp.level SEPARATOR ' > ') AS name, c1.parent_id, c1.sort_order
FROM " . DB_PREFIX . "category_path cp
LEFT JOIN " . DB_PREFIX . "category c1 ON (cp.category_id = c1.category_id)
LEFT JOIN " . DB_PREFIX . "category c2 ON (cp.path_id = c2.category_id)
LEFT JOIN " . DB_PREFIX . "category_description cd1 ON (cp.path_id = cd1.category_id)
LEFT JOIN " . DB_PREFIX . "category_description cd2 ON (cp.category_id = cd2.category_id)
WHERE cd1.language_id = '" . (int)$this->config->get('config_language_id') . "' AND cd2.language_id = '" . (int)$this->config->get('config_language_id') . "'"Или вот
code
SELECT CAST( GROUP_CONCAT( c1.category_id
ORDER BY level
SEPARATOR '_' ) AS CHAR( 100 ) ) path
FROM oc_category_path cp
LEFT JOIN oc_category c1 ON ( cp.path_id = c1.category_id )
GROUP BY cp.category_idОдним запросом получены все PATH категорий
Всё верно! При отсутствии данных в этой таблице в админке нет данных о категориях тоже. Благодарю!
В итоге я разобрался. Предположим, что есть такая иерархия категорий (в скобках указан category_id):
* Продукты (1)
** Овощи (2)
*** Картофель (3)
*** Морковь (4)
В таком случае таблица oc_category_path будет такой:
category_id | path_id | level
1 | 1 | 0
2 | 2 | 1
2 | 1 | 0
3 | 3 | 2
3 | 2 | 1
3 | 1 | 0
4 | 4 | 2
4 | 2 | 1
4 | 1 | 0
* Продукты (1)
** Овощи (2)
*** Картофель (3)
*** Морковь (4)
В таком случае таблица oc_category_path будет такой:
category_id | path_id | level
1 | 1 | 0
2 | 2 | 1
2 | 1 | 0
3 | 3 | 2
3 | 2 | 1
3 | 1 | 0
4 | 4 | 2
4 | 2 | 1
4 | 1 | 0
Чтобы ответить, войдите или зарегистрируйтесь.