Мой ответ подразумевает не использование DQL, а создание NestedSetManager, который имеет доступ к вашему соединению DBAL, что позволяет использовать SQL. Я никогда не чувствовал, что ORM хорошо поработал с логикой запросов NestedSets.
С NestedSetManager
вы можете написать множество чистых методов, и это действительно просто, потому что все эти запросы хорошо документированы. Смотрите эту ссылку . Некоторые из методов в моем NestedSetManager:
setNode();
setRoot();
loadNestedSet();
moveNodeUp();
modeNodeDown();
getRootNode();
addNodeSibling();
getNodesByDepth();
getParents();
getNodePath();
childExists();
addChildToNode();
renameNode();
deleteNode();
// And many more
Вы можете иметь мяч и создавать множество функциональных возможностей NestedSet, если вы не связаны какой-то сложной функциональностью ORM.
Также - Symfony2 делает все это действительно очень простым. Вы создаете свой файл класса NestedSetManager и ссылаетесь на него в своем Services.yml и передаете свое соединение Dbal. Моя выглядит так:
services:
manager.nestedset:
class: Acme\CoreBundle\Manager\NestedSetManager
arguments: [ @database_connection ]
затем вы можете получить доступ к своим вложенным наборам с помощью:
$path = $this->get('manager.nestedset')->setNode(4)->getNodePath(); // in your controller
Мораль истории, ORM / NestedSets привели меня в замешательство, и это решение работает очень хорошо. Если вас заставляют использовать DQL и у вас нет других вариантов, этот ответ, вероятно, будет неприемлемым.