2009-10-21 22 views
7

En CakePHP, ¿cómo se selecciona solo un subárbol en un modelo que actsAs árbol?Encontrar un subárbol en un árbol CakePHP

yo probamos este, para encontrar el árbol encabezada por el artículo con label = "My Label"

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

... sin embargo mirar los registros, se ejecuta este SQL:

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

que, evidentemente, sólo selecciona el único nodo, y no todos sus hijos.

Respuesta

15

Parece que tendrá que hacerlo en dos pasos como este (de 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'] 
    ) 
)); 

no puede utilizar la condición 'label' => 'my label' en la llamada threaded, ya que sólo encontraría resultados que coinciden esa condición, padres e hijos. 'threaded' solo reorganiza los resultados de una operación de búsqueda normal basada en el parent_id, por lo que deberá proporcionar su propia condición de lo que son los "hijos" utilizando las columnas lft/rght.

+0

Sí, terminé haciendo exactamente lo mismo, parece gracioso no haber incluido esta funcionalidad en el componente. – nickf

+0

Estoy de acuerdo, parece un caso de uso obvio. Hay '-> hijos()', pero no '-> childrenThreaded()'. Buscando en la clase de modelo estoy pensando que podrías hacer '$ model -> _ findThreaded ('after', null, $ model-> children ($ id))' si vas por id, pero parece un poco hacky . : o) – deceze

+1

Gracias por la respuesta, también esperaba una manera que sea más concisa que esta. Por cierto, si solo quieres los hijos, debes usar ''conditions' => array ('Category.lft>' => $ parent ['Category'] ['lft'], 'Category.rght <' => $ parent [ 'Categoría'] ['rght']) 'para no recuperar el elemento primario nuevamente. – bfncs

Cuestiones relacionadas