Обнуление дерева Nested Sets

Вопросы об установке, настройке и работе самого фреймворка

Re: Обнуление дерева Nested Sets

Сообщение pirrat » 01 дек 2008, 00:10

обнуление дерева приводит к тому что все узлы будут подчинены одному главному, в итоге должно быть так:

у первого узла: левый ключ = 1 , а правый = кол-во узлов*2 (т.е. если всего узлов 5, то правый ключ 10)
(в итоге правый ключ первого узла должен быть больше правого ключа последнего узла на 1)

а дальше по очереди ставить ключи так: левый ключ = правый предыдущего узла + 1 , а правый = левый текущий + 1

вот так для 5 узлов:

id | lft | rgt
1 | 1 | 10
2 | 2 | 3
3 | 4 | 5
4 | 6 | 7
5 | 8 | 9

я написал такой метод для модели, работающий с деревьями

Код: Выделить всё

    
/**
     * Метод, для восстановление структуры дерева. Все Узлы становятся подчиненные одному главному($root_node), 
     * по у молчанию главный узел с primary key =1
     * $this->table_name таблица в БД
     * $this->primary_key_column_name название первичного ключа в БД
     * $this->left_column_name название левого ключа
     * $this->right_column_name название правого ключа
     * 
     * @param $root_node int id главного узла
     *
     */
    function repairPagesTree($root_node = 1) {
        $query = $this->db->query ( "SELECT * FROM $this->table_name ORDER BY $this->primary_key_column_name" );
        $result = $query->result ();
        $count = count ( $result );
        $rgt_key_for_first = $count * 2;
        $this->db->query ( "UPDATE $this->table_name SET $this->left_column_name='0',$this->right_column_name ='0'" ); //обнуляем все ключи
        $this->db->query ( "UPDATE $this->table_name SET $this->left_column_name='1',$this->right_column_name='{$rgt_key_for_first}' WHERE $this->primary_key_column_name='{$root_node}'" ); //ставим ключи для 1ого узла
        $key = 1;
        for($i = 0; $i < $count; $i ++) {
            //ставим ключи для узлов кроме первого   
            if ($result [$i]->{$this->primary_key_column_name} != $root_node) {
                $key ++;
                $rgt_key = $key + 1;
                $id = $result [$i]->{$this->primary_key_column_name};
                $this->db->query ( "UPDATE $this->table_name SET $this->left_column_name='{$key}',$this->right_column_name='{$rgt_key}' where $this->primary_key_column_name= '{$id}'" );
                $key ++;
            }
        
        
}
    }
 


потестил - работает как надо!
Последний раз редактировалось pirrat 02 дек 2008, 10:33, всего редактировалось 2 раз(а).
CI(3проекта) -> Kohana (5 проектов) -> Yii (0)
pirrat
 
Сообщения: 114
Зарегистрирован: 02 фев 2009, 21:09

Re: Обнуление дерева Nested Sets

Сообщение pirrat » 01 дек 2008, 11:53

Раз уж пошел разговор об Nested Sets, то интересно узнать кто какими библиотеками пользуется для работы с деревьями?

Я юзаю эту http://codeigniter.com/wiki/Nested_sets/ , собственно это библиотека Joe Celko адаптированная для работы с CI
ещё присматриваюсь к этой http://php.russofile.ru/ru/authors/sql/nestedsets01/ , но пока не нашел время поконкретнее её рассмотреть
CI(3проекта) -> Kohana (5 проектов) -> Yii (0)
pirrat
 
Сообщения: 114
Зарегистрирован: 02 фев 2009, 21:09


Вернуться в Общие вопросы по фреймворку

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0