shopware/dbal-nested-set
Doctrine DBAL嵌套集实现
v1.2.3
2020-12-04 08:22 UTC
Requires
- php: ^7.2|^8.0
Requires (Dev)
- bamarni/composer-bin-plugin: ^1.4
- doctrine/dbal: ^2.5
- phpunit/phpunit: ^8.0
This package is auto-updated.
Last update: 2024-08-30 01:05:59 UTC
README
用于Shopware 5的商业套件
为DBAL用户提供的多根嵌套集实现。
描述
这个库为您提供了写入、读取和检查具有每个表多个根节点的嵌套集的类。完全依赖于Doctrine DBAL。
与其他解决方案不同,这个库有明确的边界,将软件设计留给您。
- 没有树抽象 - 只有嵌套集
- 没有实体 - 只有带有普通参数的方法调用
安装
使用composer安装库
> composer require shopware/dbal-nested-set
使用方法
您总是需要一个配置,用于设置实现的基本列名
use Shopware\DbalNestedSet\NestedSetConfig; $config = new NestedSetConfig( 'id', // Primary key column name 'left', // left column name 'right', // right column name 'level' // level column name );
然后您可以使用NestedSetFactory
创建库的不同类。
use Shopware\DbalNestedSet\NestedSetFactory; use Doctrine\DBAL\Connection; $writer = NestedSetFactory::createWriter($dbalConnection, $config);
创建树
您可能想要为嵌套集表创建一个规范化的模式,这可以通过NestedSetTableFactory
实现。它将创建具有索引的树的基DDL。因此,如果您想添加一个简单的带有名称列和自增ID的树,它看起来将像这样
$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());
当然,这是可选的,可以通过任何模式配置工具完成。
修改树
该库提供了一个包含所有插入、移动和更新操作的NestedSetWriter
类。所有操作都应该让人联想到Doctrine\DBAL\Connection::insert()
和Doctrine\DBAL\Connection::update()
,并且只需要普通数据。
例如,您可以这样做来创建一个树
$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']);
然后使用编写器移动节点
$writer->moveAsNextSibling('tree', 'root_id', 4, 7);
检查节点
您可能想要检索有关不同节点的信息。这可以通过NestedSetTableNodeInspector
来完成。
$inspector = NestedSetFactory::createTableNodeInspector($connection, $config); $inspector->isLeaf('tree', 'root_id', 9); // true | false $inspector->isAncestor('tree', 'root_id', 1, 2) // true | false
检查树
NestedSetQueryFactory
有助于从树中检索节点集。由于库没有实体的概念,它只会为您准备查询构建器,以便您可以添加选择、连接和其他条件。
$queryFactory = NestedSetFactory::createQueryFactory($connection, $config); $data = $queryFactory ->createChildrenQueryBuilder('tree', 't', 'root_id', 2) ->select('*') ->execute() ->fetchAll();
本地开发
如果您想本地开发,您可能需要通过一个小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