การใช้งานชุดที่ซ้อนกันแบบหลายรูทสำหรับผู้ใช้ 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