Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
   
 

Registered : 102,799

HOME > บทความจากสมาชิก > Nested Set model ข้อมูลเชิงซ้อนโครงสร้างต้นไม้



 

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





   
Share
Bookmark.   

  By : mr.v
  Article : บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ
  Score Rating :
  Create Date : 2016-08-28
  Download : No files
Sponsored Links
การสร้าง Textbox และ Button อยู่รวมกันใน DataGridView (Windows Form App)
การสร้าง Textbox และ Button อยู่รวมกันใน DataGridView (Windows Form App)
การสร้าง Textbox และ Button อยู่รวมกันใน DataGridview โดยสามารถทำการคลิกปุ่ม Button เพื่อทำคำสั่งต่างๆ ที่เราต้องการได้
Rating : Update : 2015-11-09 17:16:37
VB.NET ลดขนาดรูปภาพให้ได้สัดส่วนเผื่อเป็นประโยชน์ลองใช้งานแล้ว Work
VB.NET ลดขนาดรูปภาพให้ได้สัดส่วนเผื่อเป็นประโยชน์ลองใช้งานแล้ว Work
VB.NET ลดขนาดรูปภาพให้ได้สัดส่วนเผื่อเป็นประโยชน์ ลองใช้งานแล้ว work โค้ดลดขนาดรูปภาพ สามารถSave ไปยังserver ผ่านLANได้
Rating : Update : 2017-02-09 09:12:29
การสร้าง Event Scheduler  หรือ Job Schedule บน MySQL/MariaDB ตั้งเวลาทำงาน
การสร้าง Event Scheduler หรือ Job Schedule บน MySQL/MariaDB ตั้งเวลาทำงาน
การเขียน event หรือ job schedule บน mysql และ mariadb เพื่อให้ทำงานตามระยะเวลาที่กำหนด เหมาะสำหรับใช้ในการสร้าง job งงานต่างๆ เช่น backup รายการ clear ข้อมูลต่างๆ
Rating : Update : 2017-03-24 17:35:11
jQuery กับ Checkbox เทคนิคเล็กๆ กับการใช้ jquery กับ checkbox แบบง่ายๆ
jQuery กับ Checkbox เทคนิคเล็กๆ กับการใช้ jquery กับ checkbox แบบง่ายๆ
เทคนิคการเขียน jQuery เพื่อใช้งานร่วมกับ Checkbox แบบง่ายๆ เช่น การ Selector , การตรวจสอบค่าของ Checkbox หรือการ Default ค่าต่างๆ
Rating : Update : 2017-03-24 17:35:50
PHP การทำระบบ login ด้วย mysqli และการเข้ารหัส md5
PHP การทำระบบ login ด้วย mysqli และการเข้ารหัส md5
การทำระบบ login ด้วย mysqli และการเข้ารหัส md5
Rating : Update : 2016-03-29 09:19:41
ตอนที่ 7 : การใช้ Cursor บน Stored Procedure (SQL Server : Stored Procedure)
ตอนที่ 7 : การใช้ Cursor บน Stored Procedure (SQL Server : Stored Procedure)
สำหรับ Cursor เป็นการประกาศตัวแปร (Variable) ชนิด Cursor ซึ่งถ้าจะให้เข้าใจง่าย ๆ ก็คือ เป็นตัวแปรที่ได้จากค่าในขณะนั้น ๆ ที่ประกอบด้วยหลาย Column และ Index ในรูปแบบของ Recordset ที่สามารถกำหนด Block
Rating : Update : 2015-09-30 08:51:02
ระบบ Login PHP + JQuery แบบ Encrypt 2 ระดับ
ระบบ Login PHP + JQuery แบบ Encrypt 2 ระดับ
บทความแรกก็ขอเป็นระบบ Login ก่อนนะครับ อันนี้เป็น Algorithm ส่วนตัวที่มี ตัวอย่างมาจาก การ Login แบบ hash 2 Step ของ Google ซึ่งจะมีในบทความต่อไปครับ
Rating : Update : 2016-05-25 09:20:43
ThaiCreate.Com Forum

Comunity Forum Free Web Script
Jobs Freelance Free Uploads
Free Web Hosting Free Tools

สอน PHP ผ่าน Youtube ฟรี
สอน Android การเขียนโปรแกรม Android
สอน Windows Phone การเขียนโปรแกรม Windows Phone 7 และ 8
สอน iOS การเขียนโปรแกรม iPhone, iPad
สอน Java การเขียนโปรแกรม ภาษา Java
สอน Java GUI การเขียนโปรแกรม ภาษา Java GUI
สอน JSP การเขียนโปรแกรม ภาษา Java
สอน Struts การเขียนโปรแกรม Java Struts Framework
สอน jQuery การเขียนโปรแกรม ภาษา jQuery
สอน Yii  Framework การเขียนโปรแกรม ภาษา PHP กับ Yii
สอน .Net การเขียนโปรแกรม ภาษา .Net
Free Tutorial
สอน Entity Framework
สอน Android
สอน Java เขียน Java
Java GUI Swing
สอน JSP (Web App)
iOS (iPhone,iPad)
Windows Phone
Windows Azure
Windows Store
Laravel Framework
Yii PHP Framework
สอน jQuery
สอน jQuery กับ Ajax
สอน PHP OOP (Vdo)
Ajax Tutorials
SQL Tutorials
สอน SQL (Part 2)
JavaScript Tutorial
Javascript Tips
VBScript Tutorial
VBScript Validation
Microsoft Access
MySQL Tutorials
-- Stored Procedure
MariaDB Database
SQL Server Tutorial
SQL Server 2005
SQL Server 2008
SQL Server 2012
-- Stored Procedure
Oracle Database
-- Stored Procedure
SVN (Subversion)
แนวทางการทำ SEO
ปรับแต่งเว็บให้โหลดเร็ว

สุดยอด Source Code V2.0
 

แจ้งชำระเงิน/โอนเงิน
 

Hit Link
   


Acc : thaicreate@hotmail.com






Load balance : Server 05
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2017 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
for Contact Us : [Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 , 089-968-0655 อัตราราคา คลิกที่นี่