2010-02-26 57 views
4

該片段從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

一個查詢獲取所有根+一個查詢每個根對我來說似乎不是很重要? – 2010-02-26 12:25:43

+0

不僅包括所有後代的根。 – user198729 2010-02-26 13:37:05

回答

3

試試這個:

Doctrine_Core::getTable('YourTableWithTree')->createQuery('tree') 
    ->addOrderBy('tree.root_id ASC') 
    ->addOrderBy('tree.lft ASC'); 
+0

簡單但重要!非常感謝@Vladimir! – user198729 2010-03-01 01:33:55

0

您可以像Doctrine中的普通表一樣使用getBaseQuery()構建的查詢來訪問基礎表。該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; 
} 
0

看樹之前就獲取了DQL查詢整個表。學說很聰明,可以看到它已經加載了樹節點。

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"; 
} 

這會導致單個查詢。

0

這不是訣竅嗎?

$treeObject = Doctrine::getTable('Category')->getTree(); 
$tree = $treeObject->fetchTree(); 

foreach ($tree as $node) { 
    echo str_repeat('  ', $node['level']) . $node['name'] . "\n"; 
} 
相關問題