IgorPI
@IgorPI

Как управлять категориями?

Здравствуйте коллеги!

Знаю, что существует 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" нет требуемых классов для реализации.

На данный момент, это работает так:
5d61c0b77ab58353727266.gif

В DevTools
5d61c0bfbf771764319412.gif

В массиве 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 то получим все корневые узлы

Вопрос наверное заключается в том, есть ли более элегантное решение?
  • Вопрос задан
  • 27 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы