Implementasi set bersarang multi root untuk pengguna DBAL.
Pustaka ini memberi Anda kelas tulis, baca, dan inspeksi untuk kumpulan bersarang dengan beberapa simpul akar per tabel. Hanya mengandalkan Doktrin DBAL.
Berbeda dengan solusi lain, perpustakaan ini memiliki batasan yang jelas dan menyerahkan desain perangkat lunak kepada Anda.
Gunakan komposer untuk menginstal perpustakaan
> composer require shopware/dbal-nested-set
Anda selalu memerlukan konfigurasi yang menyiapkan nama kolom dasar implementasi Anda:
use Shopware DbalNestedSet NestedSetConfig ;
$ config = new NestedSetConfig (
' id ' , // Primary key column name
' left ' , // left column name
' right ' , // right column name
' level ' // level column name
);
Kemudian Anda bisa menggunakan NestedSetFactory
untuk membuat kelas perpustakaan yang berbeda.
use Shopware DbalNestedSet NestedSetFactory ;
use Doctrine DBAL Connection ;
$ writer = NestedSetFactory:: createWriter ( $ dbalConnection , $ config );
Anda mungkin ingin membuat skema yang dinormalisasi untuk tabel kumpulan bersarang, ini dapat dilakukan melalui NestedSetTableFactory
. Ini akan membuat DDL dasar untuk pohon dengan indeks. Jadi jika Anda ingin menambahkan pohon sederhana dengan kolom nama dan id kenaikan otomatis maka akan terlihat seperti ini:
$ 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 ());
Tentu saja ini opsional dan dapat dicapai melalui alat konfigurasi skema apa pun.
Pustaka menyediakan kelas NestedSetWriter
yang berisi semua operasi penyisipan, pemindahan, dan pembaruan. Semua operasi harus mengingatkan pada DoctrineDBALConnection::insert()
dan DoctrineDBALConnection::update()
dan hanya memerlukan data biasa.
Sebagai contoh, Anda dapat menggunakan ini untuk membuat pohon
$ 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 ' ]);
Dan kemudian gunakan penulis untuk memindahkan node
$ writer -> moveAsNextSibling ( ' tree ' , ' root_id ' , 4 , 7 );
Anda mungkin ingin mengambil informasi tentang node yang berbeda. Hal ini dapat dilakukan melalui NestedSetTableNodeInspector
.
$ inspector = NestedSetFactory:: createTableNodeInspector ( $ connection , $ config );
$ inspector -> isLeaf ( ' tree ' , ' root_id ' , 9 ); // true | false
$ inspector -> isAncestor ( ' tree ' , ' root_id ' , 1 , 2 ) // true | false
NestedSetQueryFactory
membantu mengambil sekumpulan node dari pohon. Karena perpustakaan tidak memiliki konsep entitas, perpustakaan hanya akan menyiapkan pembuat kueri untuk Anda yang siap menambahkan pilihan, penggabungan, dan ketentuan lainnya.
$ queryFactory = NestedSetFactory:: createQueryFactory ( $ connection , $ config );
$ data = $ queryFactory
-> createChildrenQueryBuilder ( ' tree ' , ' t ' , ' root_id ' , 2 )
-> select ( ' * ' )
-> execute ()
-> fetchAll ();
Jika Anda ingin mengembangkan secara lokal Anda mungkin harus mengkonfigurasi akses database melalui skrip shell kecil:
#! /usr/bin/env bash
export DB_USER= ' foo '
export DB_PASSWORD= ' bar '
export DB_HOST= ' baz '
export DB_NAME= ' dbal_nested_set '
bin/phpunit