Pregunta

Tengo problemas para tratar de mover los nodos subcuentos o nodos principales hacia arriba o hacia abajo ... no es tan bueno en matemáticas.

CREATE TABLE IF NOT EXISTS `pages` (   `page-id` mediumint(8) unsigned

No nulo auto_increment, page-leftMediumint (8) sin firmar no nulo,
page-right smallint (8) sin firmar no nulo, page-title texto no nulo,
page-content texto no nulo,
page-time int (11) sin firmar no nulo, page-slug texto no nulo,
page-template texto no nulo,
page-parent Mediumint (8) sin firmar no nulo, page-type texto no nulo, clave primaria (page-id)) Motor = myisam default charset = latin1;

INSERTAR EN pages (page-id, page-left, page-right, page-title, page-content, page-time, page-slug, page-template, page-parent, page-type) Valores (17, 1, 6, '1', '', 0, 'Parent', '', 0, ''), (18, 2, 5, '2', '', 0, 'Sub' , '', 17, ''), (19, 3, 4, '3', '', 0, 'sub-sub', '', 18, ''), (20, 7, 8, '5 ',' ', 0,' prueba ',' ', 0,' ');

Como ejemplo, ¿cómo movería la prueba arriba de los padres y diría que mueva sub subcubre a la subcubrina jugando con las ID de página izquierda/página-derecha? El código no es necesario, solo ayuda con el concepto o matemáticas SQL para ello, me ayudaría a entender cómo moverlo mejor ...

¿Fue útil?

Solución

Entonces, ¿básicamente desea convertir una lista de adyacencia a un conjunto anidado? Primero actualice su lista de adyacencia (es decir, actualice los valores PAGE_PARENT a los valores correctos para su nuevo árbol), luego ejecute la conversión a continuación.

Uso de PHP (código básico, no probado):

class Tree
{    
    private $count = 0;
    private $data = array();

    /**
     * Rebuild nested set
     * 
     * @param $rawData array Raw tree data
     */
    public function rebuild($rawData)
    {
        $this->data = $rawData;
        $this->count = 1;
        $this->traverse(0);        
    }

    private function traverse($id)
    {
        $lft = $this->count;
        $this->count++;

        if (isset($this->data[$id])) {
            $kid = $this->data[$id];
            if ($kid) {
                foreach ($kid as $c) {
                    $this->traverse($c);
                }
            }
        }

        $rgt = $this->count;
        $this->count++;

        // TODO: Update left and right values to $lft & $rgt in your DB for page_id $id
        ...
    }
}

Cuando llame a esto, $ RawData debe contener una matriz de ID, indexada por Parent-ID, puede crearlo (según la estructura de su tabla) de la siguiente manera ($ DB debe contener un objeto de conexión PDO activo):

    $sql = 'SELECT page_id, page_parent FROM pages ORDER BY page_parent';

    $stmt = $db->prepare($sql);
    $rawData = array();
    $stmt->execute();
    while ($row = $stmt->fetch()) {
        $parent = $row['page_parent'];
        $child = $row['page_id'];
        if (!array_key_exists($parent, $rawData)) {
            $rawData[$parent] = array();
        }
        $rawData[$parent][] = $child;
    }

Para hacer la conversión necesitaría algo como:

$tree = new Tree();
$tree->rebuild($rawData);

Entonces, básicamente, crea una matriz que contiene todos los nodos en su árbol indexado por el padre que se atravesará de manera recursiva para determinar los valores correctos de izquierda y derecha por nodo.

Por cierto, puede hacerlo en SQL simple (después de adaptar los nombres de la tabla/columna):http://bytes.com/topic/mysql/answers/638123-regenerado-nested-set-using-parent_idestructure

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top