Сортировать Gedmo Tree по произвольному полю, используя symfony4, doctrine2 и stofDoctrineExtensionsBundle - PullRequest
0 голосов
/ 13 марта 2019

Введение

Для моего личного проекта я использую:

  • Windows 10 Pro
  • XAMPP с PHP v7.2.14
  • Postgres v10.6
  • Symfony v4.2.4
  • Doctrine v2.6.3

  • StofDoctrineExtensionsBundle для управления древовидной структурой.

Настройка

Я настроил древовидную структуру (которая представляет каталоги и файлы) под названием FileTree.Я добавил несколько пользовательских полей в дерево: item_name, item_extension, item_sort_value и is_file.

Проблема

Не могу получить папки и файлы, отсортированные по полю item_sort_value в fileTree!

В то же время я могу сортировать элементы (по мере необходимости) при извлечении файлов только из пользовательского фильтра.

Мой КОД

Получение(полный размер) дерево папок

public function getFileTreeNodeArray($file_tree_root_id): array
{
    $em = $this->getEntityManager();

    $query = $em
        ->createQueryBuilder()
        ->select('ft')
        ->from(FileTree::class, 'ft')
        ->where('ft.root = :root_id')
        ->setParameter('root_id', $file_tree_root_id)
        ->orderBy('ft.root, ft.lft', 'ASC')
        //->addOrderBy('ft.itemSortValue', 'ASC')
        ->getQuery();

    $query->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true);

    return $query->getArrayResult();
}

file tree example

Получение файлов в папке

public function getFileTreeNodeContentFilesByUploaderArray($file_tree_node_id, $user_id): array
{
    $em = $this->getEntityManager();

    $is_file = true;
    $query = $em
        ->createQueryBuilder()
        ->select('ft')
        ->from(FileTree::class, 'ft')
        ->where('ft.parent = :file_tree_node_id')
        ->andWhere('ft.isFile = :is_file')
        ->andWhere('ft.uploader = :user_id')
        ->setParameter('file_tree_node_id', $file_tree_node_id)
        ->setParameter('is_file', $is_file)
        ->setParameter('user_id', $user_id)
        ->orderBy('ft.itemSortValue', 'ASC')
        ->getQuery();

    $query->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true);

    return $query->getArrayResult();
}

files in the folder

Что я пробовал

Я пытался использовать reorder и reorderAll, но "безрезультатно".

Пример

public function reorderFileTreeBranch($parent_id): void
{
    $repo_file_tree = $this->entityManager->getRepository(FileTree::class);

    $branch_node = $repo_file_tree->findOneBy(['id' => $parent_id]);
    $repo_file_tree->reorder($branch_node, 'item_sort_value', 'ASC');
    $this->entityManager->flush();
}

Я могу видеть много дополнительных запросов SQL (всякий раз, когда я использую reorder или reorderAll) в Symfony profiler, так что что-то определенно происходитвкл, но после этого - элементы сортируются одинаково в дереве ...

Заключение

Я что-то не так делаю?

Идеи и ответы приветствуются!

1 Ответ

0 голосов
/ 14 марта 2019

Ну, после многих попыток и неудач мне удалось заставить его работать как положено.Оказалось, что reorder в NestedTreeRepositoryTrait не вернул true при успехе ... Я исправил это - и так - теперь заказывал вокы как задумано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...