Frage

Ich habe Probleme, Subknoten oder übergeordnete Knoten nach oben oder unten zu bewegen ... nicht so gut in Mathe.

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

Nicht null auto_increment, page-leftMedium in (8) nicht signiert nicht null,
page-right smallint (8) nicht signiert nicht null, page-title Text nicht null,
page-content Text nicht null,
page-time int (11) nicht signiert nicht null, page-slug Text nicht null,
page-template Text nicht null,
page-parent Medium in (8) nicht signiert nicht null, page-type Text nicht null, Primärschlüssel (page-id)) Motor = MyISAM Standard charSet = latein1;

EINFÜGEN IN pages (page-id, page-left, page-right, page-title, page-content, page-time, page-slug, page-template, page-parent, page-type) Werte (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,' ');

Wie würde ich als Beispiel über Eltern testen und sagen, dass sie unter der Unter-Sub-Unter-Sub-Sub-Sub-Sub-Sub-Sub-Sub-Sub-Seite nach unten bewegt werden, indem Sie mit den IDs der Seiten-Links-/Seiten-Rechts-IDs spielen? Code ist nicht erforderlich, nur um das SQL -Konzept oder die Mathematik für ihn zu helfen, würde mir helfen, zu verstehen, wie ich es besser bewegen kann ...

War es hilfreich?

Lösung

Im Grunde möchten Sie also eine Adjazenzliste in ein verschachteltes Set konvertieren? Aktualisieren Sie zuerst Ihre Adjazenzliste (dh die Werte von Page_Parent auf die richtigen Werte für Ihren neuen Baum aktualisieren) und führen Sie die Konvertierung unten aus.

Verwenden von PHP (Basic Code, ungetestet):

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

Wenn Sie dies nennen, sollte $ rawdata eine Array von IDs enthalten, die von Parent-ID indiziert werden, können Sie sie wie folgt erstellen (basierend auf Ihrer Tabellenstruktur) ($ dB sollte ein aktives PDO-Verbindungsobjekt enthalten):

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

Um die Konvertierung durchzuführen, brauchen Sie so etwas wie:

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

Grundsätzlich erstellen Sie also ein Array, das alle Knoten in Ihrem Baum enthält, das von Eltern indiziert ist und rekursiv durchquert wird, um die richtigen linken und rechten Werte pro Knoten zu bestimmen.

Übrigens können Sie es in einfacher SQL tun (nachdem Sie die Tabellen-/Spaltennamen angepasst haben):http://bytes.com/topic/mysql/answers/638123-regenerat-nest-set-using-parent_id-sructure

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top