Eine Multi-Root-Nested-Set-Implementierung für DBAL-Benutzer.
Diese Bibliothek bietet Ihnen Schreib-, Lese- und Inspektionsklassen für verschachtelte Mengen mit mehreren Wurzelknoten pro Tabelle. Ich verlasse mich ausschließlich auf die Doktrin DBAL.
Im Gegensatz zu anderen Lösungen hat diese Bibliothek klare Grenzen und überlässt Ihnen das Software-Design.
Verwenden Sie Composer, um die Bibliothek zu installieren
> composer require shopware/dbal-nested-set
Sie benötigen immer eine Konfiguration, die die grundlegenden Spaltennamen Ihrer Implementierung festlegt:
use Shopware DbalNestedSet NestedSetConfig ;
$ config = new NestedSetConfig (
' id ' , // Primary key column name
' left ' , // left column name
' right ' , // right column name
' level ' // level column name
);
Anschließend können Sie mithilfe der NestedSetFactory
die verschiedenen Klassen der Bibliothek erstellen.
use Shopware DbalNestedSet NestedSetFactory ;
use Doctrine DBAL Connection ;
$ writer = NestedSetFactory:: createWriter ( $ dbalConnection , $ config );
Möglicherweise möchten Sie ein normalisiertes Schema für verschachtelte Mengentabellen erstellen. Dies kann über NestedSetTableFactory
erreicht werden. Es wird die Basis-DDL für einen Baum mit Indizes erstellt. Wenn Sie also einen einfachen Baum mit einer Namensspalte und einer Autoinkrementierungs-ID hinzufügen möchten, sieht das so aus:
$ tableFactory = NestedSetFactory:: createTableFactory ( $ connection , $ config );
$ schema = new Doctrine DBAL Schema Schema ();
$ table = $ tableFactory -> createTable (
$ schema ,
' tree ' , // table name
' root_id ' // nested set root id
);
$ table -> addColumn ( ' id ' , ' integer ' , [ ' unsigned ' => true , ' autoincrement ' => true ]);
$ table -> addColumn ( ' name ' , ' string ' , [ ' length ' => 255 ]);
$ table -> setPrimaryKey ([ ' id ' ]);
$ addSql = $ schema -> toSql ( $ connection -> getDatabasePlatform ());
Dies ist natürlich optional und kann mit jedem Schema-Konfigurationstool durchgeführt werden.
Die Bibliothek stellt eine NestedSetWriter
-Klasse bereit, die alle Einfüge-, Verschiebe- und Aktualisierungsvorgänge enthält. Alle Vorgänge sollten an DoctrineDBALConnection::insert()
und DoctrineDBALConnection::update()
erinnern und lediglich einfache Daten erfordern.
Als Beispiel können Sie damit einen Baum erstellen
$ writer = NestedSetFactory:: createWriter ( $ dbalConnection , $ config );
// create a Root node
$ writer -> insertRoot ( ' tree ' , ' root_id ' , 100 , [ ' name ' => ' Clothing ' ]);
// create subnodes
$ writer -> insertAsFirstChild ( ' tree ' , ' root_id ' , 1 , [ ' name ' => ' Men ' ]);
$ writer -> insertAsNextSibling ( ' tree ' , ' root_id ' , 2 , [ ' name ' => ' Women ' ]);
$ writer -> insertAsFirstChild ( ' tree ' , ' root_id ' , 2 , [ ' name ' => ' Suits ' ]);
$ writer -> insertAsFirstChild ( ' tree ' , ' root_id ' , 3 , [ ' name ' => ' Dresses ' ]);
$ writer -> insertAsNextSibling ( ' tree ' , ' root_id ' , 5 , [ ' name ' => ' Skirts ' ]);
$ writer -> insertAsNextSibling ( ' tree ' , ' root_id ' , 6 , [ ' name ' => ' Blouses ' ]);
$ writer -> insertAsFirstChild ( ' tree ' , ' root_id ' , 4 , [ ' name ' => ' Jackets ' ]);
$ writer -> insertAsFirstChild ( ' tree ' , ' root_id ' , 4 , [ ' name ' => ' Slacks ' ]);
$ writer -> insertAsFirstChild ( ' tree ' , ' root_id ' , 5 , [ ' name ' => ' Evening Gowns ' ]);
$ writer -> insertAsNextSibling ( ' tree ' , ' root_id ' , 10 , [ ' name ' => ' Sun Dresses ' ]);
Und dann verwenden Sie den Writer, um Knoten zu verschieben
$ writer -> moveAsNextSibling ( ' tree ' , ' root_id ' , 4 , 7 );
Möglicherweise möchten Sie Informationen zu verschiedenen Knoten abrufen. Dies kann über den NestedSetTableNodeInspector
erfolgen.
$ inspector = NestedSetFactory:: createTableNodeInspector ( $ connection , $ config );
$ inspector -> isLeaf ( ' tree ' , ' root_id ' , 9 ); // true | false
$ inspector -> isAncestor ( ' tree ' , ' root_id ' , 1 , 2 ) // true | false
Die NestedSetQueryFactory
hilft beim Abrufen einer Reihe von Knoten aus dem Baum. Da die Bibliothek kein Konzept für Entitäten hat, bereitet sie nur Abfrage-Builder für Sie vor, die bereit sind, Auswahlen, Verknüpfungen und andere Bedingungen hinzuzufügen.
$ queryFactory = NestedSetFactory:: createQueryFactory ( $ connection , $ config );
$ data = $ queryFactory
-> createChildrenQueryBuilder ( ' tree ' , ' t ' , ' root_id ' , 2 )
-> select ( ' * ' )
-> execute ()
-> fetchAll ();
Wenn Sie lokal entwickeln möchten, müssen Sie möglicherweise den Datenbankzugriff über ein kleines Shell-Skript konfigurieren:
#! /usr/bin/env bash
export DB_USER= ' foo '
export DB_PASSWORD= ' bar '
export DB_HOST= ' baz '
export DB_NAME= ' dbal_nested_set '
bin/phpunit