Also das hier soll ein Thread werden, welcher möglichst alle Formeln zu den Nested Sets enthalten. (z.B. Node erstellen, löschen, verschieben (Level und Reihenfolge))
Ich werde dann nach und nach eine Klasse hier in das Forum posten, welche alle diese Formeln in dieser Klasse zu Methoden zusammenfasst. Es wäre toll, wenn ihr eure Verbesserungsvorschläge einbringt! Die Klasse wird in PHP4 geschrieben werden, weil:
- PHP4 auf (fast) jedem Websever vorhanden ist
- PHP5 auch PHP4 Klassen unterstützt.
Ausgangssituation:
Die Datenbankverbindung zu MySql steht.
Formeln:
Einzelner node anhand der $id, die vorhanden sein sollte:
Node hinzufügen
Vorraussetzung: Wurzelnode muss vorhanden sein
Einfügen eines neuen Wurzelnodes
Man übergebe die zu löschende ID an unsere erste Formel
Alle diese gewonnen Daten schreibe ich "$variable" in Kleinbuchstaben.
Die ID, die ich löschen will schreibe ich in diesem Beispiel $ID um die Unterschiede
zu verdeutlichen und Verwechslungen auszuschliessen.
Falls die Childs des gelöschten nodes nicht gelöscht werden sollen,
sollten man diese mit einer späteren Formel im Level nach oben schieben
Ansonsten Childs löschen!
Gesucht:
Formel zur Berechnung des Tiefenlevels (also wie man das Level berechnet)
Ich werde dann nach und nach eine Klasse hier in das Forum posten, welche alle diese Formeln in dieser Klasse zu Methoden zusammenfasst. Es wäre toll, wenn ihr eure Verbesserungsvorschläge einbringt! Die Klasse wird in PHP4 geschrieben werden, weil:
- PHP4 auf (fast) jedem Websever vorhanden ist
- PHP5 auch PHP4 Klassen unterstützt.
Ausgangssituation:
Die Datenbankverbindung zu MySql steht.
Formeln:
Einzelner node anhand der $id, die vorhanden sein sollte:
Code:
SELECT
lft,
rgt,
id,
round((rgt - lft-1)/2,0) AS childs
FROM
tableName
WHERE
id = $id;
Node hinzufügen
Vorraussetzung: Wurzelnode muss vorhanden sein
Code:
UPDATE
tableName
SET
lft = lft + 2
WHERE
root_id = ELTERN_ROOTID
AND
lft > ELTERN_RGT
AND
rgt >= ELTERN_RGT;
UPDATE
tableName
SET
rgt=rgt+2
WHERE
root_id = ELTERN_ROOTID
AND
rgt >= rgt;
INSERT INTO
tableName
( root_id,
lft,rgt )
VALUES
( ELTERN_ROOTID,
ELTERN_RGT,
ELTERN_RGT + 1);
Einfügen eines neuen Wurzelnodes
Code:
INSERT INTO
tableName (root_id,lft,rgt)
VALUES
(0, 1, 2);
#via mysql_insert_id die id holen,
#die vergeben wurde und in $id speichern
UPDATE
tableName
SET
root_id = $id
WHERE
id = $id;
Man übergebe die zu löschende ID an unsere erste Formel
Alle diese gewonnen Daten schreibe ich "$variable" in Kleinbuchstaben.
Die ID, die ich löschen will schreibe ich in diesem Beispiel $ID um die Unterschiede
zu verdeutlichen und Verwechslungen auszuschliessen.
Code:
UPDATE
tableName
SET
lft = lft - 2
WHERE
lft > $lft AND
root_id = $root_id;
UPDATE
tableName
SET
rgt = rgt - 2
WHERE
rgt > $rgt AND
root_id = $root_id;
DELETE
FROM
tableName
WHERE
id = $ID;
Falls die Childs des gelöschten nodes nicht gelöscht werden sollen,
sollten man diese mit einer späteren Formel im Level nach oben schieben
Ansonsten Childs löschen!
Code:
DELETE
FROM
tableName
WHERE
rgt <= $rgt AND
lft >= $lft AND
root_id = $root_id;
UPDATE
tableName
SET
rgt = rgt - ($rgt - $lft+1)
WHERE
rgt > $rgt AND
root_id = $root_id;
UPDATE
tableName
SET
lft = lft - ($rgt - $lft + 1)
WHERE
lft > $rgt AND
root_id = $root_id;
Formel zur Berechnung des Tiefenlevels (also wie man das Level berechnet)
Zuletzt bearbeitet: