Una implementación de conjunto anidado de múltiples raíces para usuarios de DBAL.
Esta biblioteca le proporciona clases de escritura, lectura e inspección para conjuntos anidados con múltiples nodos raíz por tabla. Confiando únicamente en la Doctrina DBAL.
A diferencia de otras soluciones, esta biblioteca tiene límites claros y deja el diseño del software en sus manos.
Utilice Composer para instalar la biblioteca.
> composer require shopware/dbal-nested-set
Siempre necesita una configuración que establezca los nombres de las columnas básicas de su implementación:
use Shopware DbalNestedSet NestedSetConfig ;
$ config = new NestedSetConfig (
' id ' , // Primary key column name
' left ' , // left column name
' right ' , // right column name
' level ' // level column name
);
Luego puedes usar NestedSetFactory
para crear las diferentes clases de la biblioteca.
use Shopware DbalNestedSet NestedSetFactory ;
use Doctrine DBAL Connection ;
$ writer = NestedSetFactory:: createWriter ( $ dbalConnection , $ config );
Es posible que desee crear un esquema normalizado para tablas de conjuntos anidados; esto se puede lograr a través de NestedSetTableFactory
. Creará el DDL base para un árbol con índices. Entonces, si desea agregar un árbol simple con una columna de nombre y una identificación de incremento automático, se verá así:
$ 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 ());
Por supuesto, esto es opcional y se puede lograr mediante cualquier herramienta de configuración de esquema.
La biblioteca proporciona una clase NestedSetWriter
que contiene todas las operaciones de inserción, movimiento y actualización. Todas las operaciones deben recordar a DoctrineDBALConnection::insert()
y DoctrineDBALConnection::update()
y solo requieren datos simples.
Como ejemplo, puedes usar esto para crear un árbol.
$ 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 ' ]);
Y luego usa el escritor para mover los nodos.
$ writer -> moveAsNextSibling ( ' tree ' , ' root_id ' , 4 , 7 );
Es posible que desee recuperar información sobre diferentes nodos. Esto se puede hacer a través de NestedSetTableNodeInspector
.
$ inspector = NestedSetFactory:: createTableNodeInspector ( $ connection , $ config );
$ inspector -> isLeaf ( ' tree ' , ' root_id ' , 9 ); // true | false
$ inspector -> isAncestor ( ' tree ' , ' root_id ' , 1 , 2 ) // true | false
NestedSetQueryFactory
ayuda a recuperar un conjunto de nodos del árbol. Dado que la biblioteca no tiene concepto de entidades, solo preparará generadores de consultas listos para agregar selecciones, uniones y otras condiciones.
$ queryFactory = NestedSetFactory:: createQueryFactory ( $ connection , $ config );
$ data = $ queryFactory
-> createChildrenQueryBuilder ( ' tree ' , ' t ' , ' root_id ' , 2 )
-> select ( ' * ' )
-> execute ()
-> fetchAll ();
Si desea desarrollar localmente, es posible que deba configurar el acceso a la base de datos mediante un pequeño script de shell:
#! /usr/bin/env bash
export DB_USER= ' foo '
export DB_PASSWORD= ' bar '
export DB_HOST= ' baz '
export DB_NAME= ' dbal_nested_set '
bin/phpunit