2009-10-21 3 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

+0

Согласен, кажется очевидным прецедентом. Там '-> children()', но не '-> childrenThreaded()'. Я думаю, что вы, вероятно, можете сделать '$ model -> _ findThreaded ('after', null, $ model-> children ($ id))', если вы идете по id, но, похоже, это хакка , : o) – deceze

+1

Спасибо за ответ, я также надеялся, что это будет более кратким, чем это. Кстати, если вам нужны только дети, вы должны использовать '' conditions '=> array (' Category.lft> '=> $ parent [' Category '] [' lft '],' Category.rght <' => $ parent [ 'Category'] ['rght']) ', чтобы не возвращать родителя. – bfncs

 Смежные вопросы

  • Нет связанных вопросов^_^