Domanda

Sto avendo difficoltà cercando di spostare i nodi secondari o del genitore nodi su o in giù ... non che bravo in matematica.

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

NOT NULL AUTO_INCREMENT, page-left   MEDIUMINT (8) unsigned NOT NULL,
  page-right smallint (8) unsigned NOT   NULL, il testo page-title NOT NULL,
  testo page-content NOT NULL,
  page-time int (11) NOT NULL senza segno,   testo page-slug NOT NULL,
  testo page-template NOT NULL,
  page-parent MEDIUMINT (8) unsigned   NOT NULL, il testo page-type NOT NULL,   PRIMARY KEY (page-id))   MOTORE = MyISAM DI DEFAULT CHARSET = latin1   ;

     

INSERT INTO pages (page-id,   page-left, page-right,   page-title, page-content,   page-time, page-slug,   page-template, page-parent,   page-type) VALORI (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,   'TEST', '', 0, '');

Per esempio, come mi trasferirei TEST sopra PARENT e dire mossa SUB basso SUB-SUB giocando con gli ID di pagina a sinistra / pagina-destra? Codice non è richiesto solo aiutare con il concetto di SQL o la matematica per essa, mi avrebbe aiutato a capire come muoversi meglio ...

È stato utile?

Soluzione

Quindi, in pratica si desidera convertire un lista di adiacenza ad un insieme nidificato? In primo luogo aggiornare la lista di adiacenza (es. Aggiornare i valori page_parent ai valori corretti per il nuovo albero), quindi eseguire la conversione di seguito.

Utilizzo di PHP (codice di base, non testato):

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
        ...
    }
}

Quando si chiama questo, $ rawData dovrebbe contenere una serie di ID di, indicizzato da genitore-id, è possibile crearlo (in base alla struttura della tabella) come segue ($ db dovrebbe contenere un oggetto collegamento attivo DOP):

    $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;
    }

Per fare la conversione si avrebbe bisogno di qualcosa di simile a:

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

Quindi, in pratica si crea un array contenente tutti i nodi nell'albero indicizzate da un genitore che verranno attraversati in maniera ricorsiva per determinare i giusti valori corretti e sinistra per nodo.

A proposito Si potrebbe farlo in SQL pianura (dopo di adattare i nomi di tabella / colonna): http://bytes.com/topic/ mysql / risposte / 638.123-rigenerarsi-nested-set-con-parent_id-struttura

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top