2014-02-09 4 views
0

Мне просто интересно, как извлечь определенные элементы уровня из модели с помощью TreeBehavior.CakePHP Поведение дерева - элементы сфигового уровня

Это довольно просто для элементов первого уровня. Просто найдите элементы с parent_id => null, но для более глубоких уровней ...?

Есть ли какой-либо чистый и простой способ сделать это?

+0

Вы знаете родителя элементов, к которым вы пытаетесь получить доступ? Вы должны иметь доступ к ним с помощью 'parent_id => 7' (или независимо от идентификатора родительского элемента). –

+0

Нет, я этого не делаю. Я просто хочу отображать (например) все элементы второго уровня, и я не знаю, сколько элементов 1-го уровня существует в db, и каков их идентификатор. Конечно, можно получить все идентификаторы первого уровня, а затем найти всех детей для этих идентификаторов. Но это звучит немного сложно, если мы хотим получить очень глубокие элементы уровня. – hawlikus

+0

Я не думаю, что есть способ определить, какой уровень элемент находится только от дерева. Лучший вариант, о котором я могу думать, - добавить еще одно поле в базу данных, которое идентифицирует уровень, а затем убедитесь, что вы изменяете это поле всякий раз, когда вы редактируете элемент. –

ответ

1

Это можно сделать в чистом 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.

+0

Я тестировал свою таблицу «групп» и, похоже, работал. Просто примечание: is 'rght', а не' rgt' – arilia

+0

Привет, он работает хорошо (как написано arilia rght insted of rgt), но я не могу понять, как ограничить результат запроса до одного уровня. И level = x исключений запроса возврата «Неизвестный столбец« уровень »в разделе« где » – hawlikus

+0

@hawlikus добавить' HAVING level = 2' после оператора GROUP – arilia