Просто извлеките всю таблицу с DQL-запросом, прежде чем смотреть на дерево. Доктрина достаточно умна, чтобы видеть, что она уже загрузила узлы дерева.
* 1003 Е.Г. *
$q = Doctrine_Query::create()->from('Category c')->orderBy('c.level');
$categories = $q->execute();
Если в вашей таблице n деревьев (то есть n корневых узлов), то первые n объектов в $ категориях - это корни вашего дерева.
В зависимости от вашего варианта использования, вы можете сортировать или увлажнять по-разному. Например, чтобы распечатать дерево (как в вашем примере), вы можете сделать это:
$q = Doctrine_Query::create()
->select('c.name, c.level')
->from('Category c');
->orderBy('c.lft')
->setHydrationMode(Doctrine::HYDRATE_SCALAR);
$categories = $q->execute();
foreach ($categories as $category) {
print str_repeat(' ', $category['c_level']) . $category['c_name'] . "\n";
}
Это приводит к одному запросу.