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