2009-10-21 65 views
7

在CakePHP中,如何選擇一棵樹中的子樹?actsAs樹?在CakePHP樹中查找子樹

我想這一點,找到由項目爲首的樹label = "My Label"

$this->find("threaded", array(
    "conditions" => array(
     "label" => "My Label" 
    ) 
)); 

...但看日誌,它運行這個SQL:

SELECT Menu.id, Menu.parent_id, Menu.lft, Menu.rght, Menu.label, Menu.link 
FROM menus Menu 
WHERE label = 'My Label' 

這顯然只能選擇一個節點,而不是所有的孩子。

回答

15

看來你將不得不做,在這樣的兩個步驟(從the manual):

$parent = $this->Category->find('first', array(
    'conditions' => array('label' => 'My label') 
)); 
$parentAndChildren = $this->Category->find('threaded', array(
    'conditions' => array(
     'Category.lft >=' => $parent['Category']['lft'], 
     'Category.rght <=' => $parent['Category']['rght'] 
    ) 
)); 

您不能使用'label' => 'my label'條件在threaded調用,因爲它只能找到匹配的結果那種狀況,父母和孩子。 'threaded'只根據parent_id重新排列正常查找操作的結果,因此您必須通過使用lft/rght列來提供自己的「子」的條件。

+0

是的我最終做了非常完全相同的事情 - 似乎有趣的是沒有在組件中包含此功能。 – nickf 2009-10-21 04:57:23

+0

我同意,似乎是一個明顯的用例。有' - > children()'但沒有' - > childrenThreaded()'。圍繞模型類我認爲你可以做'$ model - > _ findThreaded('after',null,$ model-> children($ id))''如果你要通過id去,但它看起來有點不好意思。 :o) – deceze 2009-10-21 08:28:33

+1

感謝您的回答,我也希望有一種比這更簡潔的方式。順便說一句,如果你只想要孩子,你應該使用''conditions'=> array('Category.lft>'=> $ parent ['Category'] ['lft'],'Category.rght <' => $ parent [ 'Category'] ['rght'])'不能再次獲取父項。 – bfncs 2012-10-02 07:09:24