у первого узла: левый ключ = 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 ++;
}
}
}
потестил - работает как надо!
