Estructuras de árbol en sql, sin recursión. (Codeigniter)

Partimos de una tabla de adyacencia con la siguiente estructura:

*id
-nombre
-parent_id

añadimos los campos:
-rgt
-lft

para generar el árbol:

 function rebuild_tree($parent_id, $left){
        //lugar desde el que recalculamos el arbol
        $right = $left + 1;
        $this->db->select("id");
        $query = $this->db->get_where("balance_situacion", array("padre_id"=>$parent_id));
        $result = $query->result_array();
        foreach ($result as $item){
            var_dump($item);
            $right = $this->rebuild_tree($item['id'], $right);
        }
        $this->db->where("id", $parent_id);
        $this->db->update("balance_situacion", array("lft"=>$left, "rgt"=> $right));
        return $right + 1;        
    }

para recorrer el arbol (y mostrarlo en pantalla):

 function display_tree($root_id){
        $qry = $this->db->get_where("balance_situacion", array("id"=>$root_id));
        $rst = $qry->row_array();
        
        $right = array();
        $this->db->where("lft BETWEEN '". $rst['lft'] ."' AND '". $rst['rgt'] ."'");
        $this->db->order_by("lft ASC");
        $qry = $this->db->get("balance_situacion");
        $rst = $qry->result_array();
        foreach($rst as $row){
            if(count($right)>0){
                while($right[count($right)-1]<$row['rgt']){
                    array_pop($right);
                }
            }
            if(abs($row['lft']-$row['rgt'])==1){
                echo '<span style="color: red">';
              }
            
            echo str_repeat('&emsp;', $row['categoria']/*count($right)*/).$row['nombre']. "<br />";
            $right[] = $row['rgt'];
            
             if(abs($row['lft']-$row['rgt'])==1){
                echo "</span>";
            }
        }

    }

0 comentarios:

Publicar un comentario