dbal nested set
PHP 7.2-8.0
DBAL 使用者的多根嵌套集實作。
該庫為每個表具有多個根節點的巢狀集提供寫入、讀取和檢查類別。僅依靠 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 來移動節點
$ 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