[英]How can I fetch the entire tree in a single query with doctrine?
来自官方网站的这个片段按预期工作:
$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";
}
}
但我看到有数十个查询发送到数据库。
我该怎么做才能满嘴?
试试这个:
Doctrine_Core::getTable('YourTableWithTree')->createQuery('tree')
->addOrderBy('tree.root_id ASC')
->addOrderBy('tree.lft ASC');
有一个内置于O(n)的算法,它构建一个完整的树,具有m级,而不管集合的顺序如何
您可以像使用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;
}
在查看树之前,只需使用DQL查询获取整个表。 Doctrine很聪明,可以看到它已经加载了树节点。
例如
$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";
}
这导致单个查询。
这不是诀窍吗?
$treeObject = Doctrine::getTable('Category')->getTree();
$tree = $treeObject->fetchTree();
foreach ($tree as $node) {
echo str_repeat(' ', $node['level']) . $node['name'] . "\n";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.