来自official website的此代码段按预期工作:
$treeObject = Doctrine::getTable('Category')->getTree();
$rootColumnName = $treeObject->getAttribute('rootColumnName');
foreach ($treeObject->fetchRoots() as $root) {
$options = array(
'root_id' => $root->$rootColumnName
);
foreach($treeObject->fetchTree($options) as $node) {
echo str_repeat(' ', $node['level']) . $node['name'] . "\n";
}
}
但我发现有数十个查询被发送到数据库。
我怎么能满嘴?
答案 0 :(得分:3)
试试这个:
Doctrine_Core::getTable('YourTableWithTree')->createQuery('tree')
->addOrderBy('tree.root_id ASC')
->addOrderBy('tree.lft ASC');
答案 1 :(得分:1)
有一种内置于O(n)的算法,可以构建一个完整的树,具有m个级别,而不管集合的顺序
答案 2 :(得分:0)
您可以使用getBaseQuery()
构建的查询,像Doctrine中的普通表一样访问基础表。 API缺少此方法的描述,但请检查源代码:
public function getBaseQuery()
{
if ( ! isset($this->_baseQuery)) {
$this->_baseQuery = $this->_createBaseQuery();
}
return $this->_baseQuery->copy();
}
// ...
private function _createBaseQuery()
{
$this->_baseAlias = "base";
$q = Doctrine_Core::getTable($this->getBaseComponent())
->createQuery($this->_baseAlias)
->select($this->_baseAlias . '.*');
return $q;
}
答案 3 :(得分:0)
在查看树之前,只需使用DQL查询获取整个表。 Doctrine很聪明,可以看到它已经加载了树节点。
E.g。
$q = Doctrine_Query::create()->from('Category c')->orderBy('c.level');
$categories = $q->execute();
如果你的表中有n个树(即n个根节点),那么$ categories中的前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";
}
这导致单个查询。
答案 4 :(得分:0)
这不是诀窍吗?
$treeObject = Doctrine::getTable('Category')->getTree();
$tree = $treeObject->fetchTree();
foreach ($tree as $node) {
echo str_repeat(' ', $node['level']) . $node['name'] . "\n";
}