Это можно сделать в чистом SQL. Вы можете получить даже количество потомков на узел.
SELECT n.name,
COUNT(*)-1 AS level,
ROUND ((n.rgt - n.lft - 1)/2) AS offspring
FROM tree AS n,
tree AS p
WHERE n.lft BETWEEN p.lft AND p.rgt
GROUP BY n.lft
ORDER BY n.lft;
Если добавить HAVING level = 2
после GROUP
заявления, он может получить только уровень, который вы ищете. Честно говоря, я был ленив, чтобы проверить его прямо сейчас и превратить его в массив CakePHP find(), попробуйте.
Этот сайт http://www.klempert.de/nested_sets/ имеет очень хорошее объяснение того, как работать с деревьями, но он написан на немецком языке, вы можете попробовать его перевести с помощью google translate.
Вы знаете родителя элементов, к которым вы пытаетесь получить доступ? Вы должны иметь доступ к ним с помощью 'parent_id => 7' (или независимо от идентификатора родительского элемента). –
Нет, я этого не делаю. Я просто хочу отображать (например) все элементы второго уровня, и я не знаю, сколько элементов 1-го уровня существует в db, и каков их идентификатор. Конечно, можно получить все идентификаторы первого уровня, а затем найти всех детей для этих идентификаторов. Но это звучит немного сложно, если мы хотим получить очень глубокие элементы уровня. – hawlikus
Я не думаю, что есть способ определить, какой уровень элемент находится только от дерева. Лучший вариант, о котором я могу думать, - добавить еще одно поле в базу данных, которое идентифицирует уровень, а затем убедитесь, что вы изменяете это поле всякий раз, когда вы редактируете элемент. –