Über Doctrine schreibe ich ja gerne mal was, so auch heute. Da Doctrine 2.2 die letzte aktuelle Version ist, hoffe ich, dass es noch andere gibt, die ältere Versionen einsetzen und folgende Informationen vielleicht nützlich finden.
Kindknoten hinzufügen
Ein Nested Set zu speichern, bei dem die Sortierung der Knoten der Reihenfolge entspricht, wie sie hinzugefügt werden, sieht auf den ersten Blick ganz einfach aus:
$node->getNode()->insertAsLastChildOf($parent);
Aber: Doctrine ändert bei diesem Funktionsaufruf automatisch die Grenzen der Teilmenge (links und rechts), ausgehend von $parent, in der Datenbank. Die Grenzen vom Objekt $parent werden aber nicht aktualisiert. Das führt dazu, dass neue Knoten nicht als letztes, sondern als erstes Kind hinzugefügt werden. Ein simples
$parent->refresh();
nach jeder Änderung, löst das Problem.
Teilbäume
Zum Abschluss, stell ich noch Code zur Verfügung, der einen Teilbaum aus einem Nested Set, mit dem Namen Tree, selektiert:
$table = Doctrine_Core::getTable('Tree');
$tree = $table->getTree();
$query = $table->createQuery('t, Tree p')
->select('t.*')
->orderBy('t.lft ASC')
->where('p.id = ?', $id)
->andWhere('t.root_id = p.root_id')
->andWhere('t.level >= p.level')
->andWhere('t.lft BETWEEN p.lft and p.rgt');
$tree->setBaseQuery($query);
$hierarchy = $tree->fetchTree();
$tree->resetBaseQuery();
0 Kommentare
Trackbacks/Pingbacks