|
Nested Set model ข้อมูลเชิงซ้อนโครงสร้างต้นไม้ |
Nested Set model ข้อมูลเชิงซ้อนโครงสร้างต้นไม้ Nested Set model นี้จะมีส่วนช่วยให้งานจัดการข้อมูลเชิงซ้อนนี้ง่ายขึ้น โดยมันจะรองรับทั้งการแสดงทีละหลายรายการ (list items), แสดงรายการที่เลือกและรายการลูกทั้งหมด, แสดงรายการลูกที่เลือก แล้วไล่ขึ้นไปทางรายการต้นกำเนิดจนถึงรากชั้นบนสุด, ลบข้อมูลรายการที่เลือกและรายการลูกทั้งหมด หรือ ลบรายการที่เลือกแล้วดึงรายการลูกขึ้นมาแทนที่, สร้างข้อมูล level, left, right ใหม่ (rebuild), ตรวจสอบการแก้ไขรายการต้นกำเนิดที่ถูกต้องจะต้องไม่ไปอยู่ใต้รายการลูกของตนเอง เป็นต้น.
Downloads
Download 1 Download 2 Install via Composer
API document
รูปตัวอย่างประกอบการอธิบาย

ตัวอย่างโค้ด
การติดตั้ง
ถ้าติดตั้งผ่าน Composer ก็ไม่ต้อง include ไฟล์เหล่านี้
Code (PHP)
1. include_once '/path/to/Rundiz/NestedSet/Database.php' ;
2. include_once '/path/to/Rundiz/NestedSet/NestedSet.php' ;
การตั้งค่า - ปรับแต่ง
กำหนดค่าฐานข้อมูลให้กับคลาสนี้ เพื่อให้มันสามารถทำการ สร้าง, อ่าน, ปรับปรุง, ลบ ข้อมูลได้อย่างถูกต้อง.
Code (PHP)
01. $db [ 'dsn' ] = 'mysql:dbname=YOUR_DB_NAME;host=localhost;port=3306;charset=UTF8' ;
02. $db [ 'username' ] = 'admin' ;
03. $db [ 'password' ] = 'pass' ;
04. $db [ 'options' ] = [
05. \PDO::ATTR_EMULATE_PREPARES => false,
06. \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
07. ];
08. $db [ 'tablename' ] = 'test_taxonomy' ;
09. $NestedSet = new \Rundiz\NestedSet\NestedSet([ 'pdoconfig' => $db , 'tablename' => $db [ 'tablename' ]]);
เปลี่ยนชื่อคอลัมน์หรือฟิลด์ต่างๆ
id_column_name กำหนดชื่อคอลัมน์ที่เป็น ID (primary key).
parent_id_column_name ชื่อคอลัมน์ที่อ้างอิงไปยัง ID ต้นกำเนิด. เมื่อไม่มีต้นกำเนิดหรืออยู่ที่ราก ค่านี้จะต้องเป็น 0 เสมอ ไม่ใช่ค่า NULL.
left_column_name คอลัมน์ของข้อมูลค่าเลข"ซ้าย". สำหรับข้อมูลเลข ซ้าย, ขวา โปรดดูจากรูปตัวอย่างด้านบน ซึ่งเลขทั้งสองจะเริ่มจาก 1 ที่รายการแรกด้านซ้าย ไล่ลงมาเรื่อยๆและไล่กลับขึ้นไป อย่างนี้เสมอ
right_column_name คอลัมน์ของข้อมูลค่าเลข"ขวา".
level_column_name คอลัมน์ของข้อมูลค่าเลขระดับ ที่อ้างอิงถึงระดับชั้นความลึก โดยมันจะเริ่มที่ 1.
position_column_name คอลัมน์ของข้อมูลตำแหน่งลำดับการแสดงผล โดยเริ่มจาก 1 ในแต่ละระดับชั้นของมันเสมอ.
ชื่อตารางโดยปกติแล้วจะถูกกำหนดอัตโนมัติตามการตั้งค่าด้านบน ($db['tablename'] = 'test_taxonomy';).
Code (PHP)
1. $NestedSet ->id_column_name = 'category_id' ;
2. $NestedSet ->left_column_name = 'category_left' ;
3. $NestedSet ->right_column_name = 'category_right' ;
4. $NestedSet ->level_column_name = 'category_level' ;
5. $NestedSet ->position_column_name = 'category_position' ;
เพิ่ม, ปรับปรุงข้อมูล
ขอข้อมูลตำแหน่งใหม่
จาก sql ตัวอย่างที่อยู่ในไฟล์ดาวน์โหลด จะมีข้อมูล position อยู่ด้วย ซึ่งมันมีความสำคัญในการลำดับการแสดงผล โดยข้อมูลตำแหน่งนี้จะไล่จาก 1 ขึ้นไปเรื่อยๆ และเมื่อมันอยู่ต่างต้นกำเนิดกัน ก็จะเริ่มที่ 1 ใหม่เสมอ
Code (PHP)
1. $new_position = $NestedSet ->getNewPosition(4);
เพิ่ม/ปรับปรุง
การเพิ่ม (insert), และการปรับปรุงข้อมูล (update) ทุกๆกรณีที่มีคำสั่ง INSERT, UPDATE จะต้องมีการรันเมธอด rebuild() เสมอ เพื่อสร้างข้อมูล level, left, right ที่ถูกต้อง.
Code (PHP)
1. $stmt = $PDO ->prepare( 'INSERT INTO `test_taxonomy`(`parent_id`, `name`, `position`) VALUES (?, ?, ?)' );
2. $stmt ->execute([0, 'Root 4' , 4]);
3. $NestedSet ->rebuild();
Code (PHP)
1. $stmt = $PDO ->prepare('UPDATE `test_taxonomy`SET `name` = ?, `position` = ? WHERE `id` = ?;
2. $stmt ->execute([ 'Root 4 new name' , 4, 21]);
3. $NestedSet ->rebuild();
บางกรณีอาจมีการเพิ่มหรือปรับปรุงข้อมูลครั้งละมากๆ ก็สามารถรันเมธอด rebuild ในภายหลังสุดได้.
ตรวจสอบว่ารายการต้นกำเนิดที่เลือกอยู่ภายใต้รายการลูกหรือไม่
สมมุติว่ามีข้อมูลดังต่อไปนี้. Root 2 > 2.1 > 2.1.1 > 2.1.1.1 เมื่อทำการแก้ไขข้อมูลที่ชื่อ 2.1 ต้นกำเนิดเดิมคือ Root 2 ซึ่งไม่ได้เป็นลูกของ 2.1 แต่เมื่อจะทำการเปลี่ยนต้นกำเนิดใหม่ โดยเลือกต้นกำเนิดใหม่ไปที่ 2.1.1 ซึ่งเป็นลูกของ 2.1, ดังนั้นต้นกำเนิดใหม่นี้ก็จะไม่ถูกต้อง การตรวจสอบนี้สามารถทำได้โดยใช้ isParentUnderMyChildren() ซึ่งค่าที่ได้รับกลับมาจะเป็น boolean โดยที่ค่า false หมายถึงต้นกำเนิดที่เลือกใหม่ไม่ได้อยู่ภายใต้รายการลูก คือข้อมูลนี้ถูกต้อง แต่ถ้าหากเป็น true หมายถึงรายการต้นกำเนิดที่เลือกใหม่นี้อยู่ภายใต้รายการลูก ซึ่งไม่ถูกต้อง.
Code (PHP)
1. $editing_item_id = 9;
2. $new_parent_id = 7;
3. var_dump( $NestedSet ->isParentUnderMyChildren( $editing_item_id , $new_parent_id ));
4.
5. $new_parent_id = 14;
6. var_dump( $NestedSet ->isParentUnderMyChildren( $editing_item_id , $new_parent_id ));
อ่านข้อมูล
การจะอ่านหรือดึงข้อมูลของรายการที่เลือก พร้อมทั้งรายการลูกๆทั้งหมด สามารถทำได้ง่ายดังนี้.
Code (PHP)
1. $options [ 'filter_taxonomy_id' ] = 3;
2. $list_txn = $NestedSet ->getTaxonomyWithChildren( $options );
3. unset( $options );
4. print_r( $list_txn );
การอ่านหรือดึงข้อมูลของรายการที่เลือก รวมถึงรายการต้นกำเนิดของมันไปจนถึงรายการรากชั้นแรกสุด ก็สามารถทำได้ง่ายดังนี้.
Code (PHP)
1. $options [ 'taxonomy_id' ] = 13;
2. $list_txn = $NestedSet ->getTaxonomyWithParents( $options );
3. unset( $options );
4. print_r( $list_txn );
แสดงรายการ(หลายๆรายการ)
นอกจากการดึงรายการที่เลือกแล้ว คุณยังสามารถแสดงรายการทีละหลายๆรายการได้โดยใช้เมธอด listTaxonomy() สำหรับการเรียกข้อมูลออกมาเป็น array เชิงซ้อน (nested) และใช้เมธอด listTaxonomyFlatten() สำหรับการเรียกข้อมูลออกมาเป็นแบบ array ราบเรียบ.
Code (PHP)
1. $options = [];
2. $options [ 'unlimited' ] = true;
3. $list_txn = $NestedSet ->listTaxonomy( $options );
4. unset( $options );
ตัวแปร $list_txn จะมีค่าเป็น array โดยจะมีคีย์เป็น total และ items.
ค่า options ต่างๆของทั้ง 2 เมธอดนั้นเหมือนกัน โปรดดูรายการอ้างอิงค่า options ต่างๆที่รองรับผ่านเอกสาร API.
ลบรายการ
คุณสามารถเลือกได้ว่าจะลบรายการอย่างไร
- ลบรายการที่เลือกและรายการลูกทั้งหมด
- ลบรายการที่เลือกและดึงรายการลูกขึ้นมาแทนที่
และทุกครั้งที่คุณลบข้อมูล อย่าลืมที่จะเรียกเมธอด rebuild เพื่อทำการสร้างข้อมูล level, left, right ใหม่ให้ถูกต้อง.
ลบรายการที่เลือกและรายการลูกทั้งหมด
Code (PHP)
1. $NestedSet ->deleteWithChildren(16);
2. $NestedSet ->rebuild();
ลบรายการที่เลือกและดึงรายการลูกขึ้นมา
Code (PHP)
1. $NestedSet ->deletePullUpChildren(9);
2. $NestedSet ->rebuild();
Reference : http://rundiz.com/web-resources/downloads/nested-set-model
|
|
Total Votes: 1Overall Rating: 4 / 5 |
|
 |
|
|
|
By : |
mr.v
|
|
Article : |
บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ |
|
Score Rating : |
   |
|
Create Date : |
2016-08-28 |
|
Download : |
No files |
|
|
|
|