تطبيق مجموعة متداخلة متعددة الجذور لمستخدمي DBAL.
توفر لك هذه المكتبة فئات الكتابة والقراءة والفحص للمجموعات المتداخلة ذات العقد الجذرية المتعددة لكل جدول. الاعتماد فقط على عقيدة DBAL.
على عكس الحلول الأخرى، تتمتع هذه المكتبة بحدود واضحة وتترك تصميم البرنامج لك.
استخدم الملحن لتثبيت المكتبة
> 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 الأساسي لشجرة ذات فهارس. لذا، إذا كنت تريد إضافة شجرة بسيطة تحتوي على عمود اسم ومعرف زيادة تلقائية، فستبدو كما يلي:
$ 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