繁体   English   中英

如何使用doctrine在单个查询中获取整个树?

[英]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级,而不管集合的顺序如何

https://gist.github.com/mmoreram/6292326

您可以像使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM