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
クラスを提供します。すべての操作はDoctrineDBALConnection::insert()
およびDoctrineDBALConnection::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 ();
ローカルで開発したい場合は、小さなシェル スクリプトを通じてデータベース アクセスを構成する必要がある場合があります。
#! /usr/bin/env bash
export DB_USER= ' foo '
export DB_PASSWORD= ' bar '
export DB_HOST= ' baz '
export DB_NAME= ' dbal_nested_set '
bin/phpunit