shopware/dbal-nested-set

Doctrine DBAL嵌套集实现

v1.2.3 2020-12-04 08:22 UTC

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