Здравствуйте коллеги!
Знаю, что существует nested set
Какой-то он сложный, я ещё до конца не понял как это работает.
Время поджимает, а категориями управлять нужно быдло ещё вчера.
/** @var Category $parent */
$parent = $repo->getById(1222); // 1222 идентификатор родителя
$p = $parent->getParent(); // object или null
$lvl = 0; // Уровень
while (true) {
$lvl++; // Повышаю уровень
if (is_null($p)) {
break; // если родителей больше нет
}
$p = $p->getParent(); // Получаем родителя
}
$new_category = new Category();
$new_category->setName("children 1");
$new_category->setParent($parent);
$new_category->setLvl($lvl);
$this->em->persist($new_category);
$this->em->flush();
Для логики навигации по уровням, мне требуется знать на каком я уровне.
Корневые категории 0 = lvl и далее на повышение.
Выше, я привел пример, как я собрался вычислять уровень, при создании новой ветки.
Есть ощущения, что это топорное решение и я копаю не в ту сторону.
Может есть рабочий модуль для работы с деревьями.
Был
тут
Но чёрт возьми, в "gedmo/doctrine-extensions": "dev-master" нет требуемых классов для реализации.
На данный момент, это работает так:
В DevTools
В массиве tree_history как раз хранятся уровни, уровень это ключ идентификатора узла.
Для полноты картины, уровни запрашиваю по API
{{ADMIN_BASE_URL}}/category.get?count=1000&offset=0&sort=DESC&parent_id=52
{
"count": 47,
"items": [
{
"alt_name": "Розовые авто",
"name": "Авто",
"id": 2,
"lvl": "0"
},
{
"alt_name": null,
"name": "Безопасность",
"id": 3,
"lvl": "0"
},
{
"alt_name": null,
"name": "Бизнес",
"id": 4,
"lvl": "0"
},
...
Если не передавать parent_id то получим все корневые узлы
Вопрос наверное заключается в том, есть ли более элегантное решение?