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

Registered : 104,071

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
C# การใช้ DateTimePicker เพื่อใช้เปรียบเทียบวันเวลาแบบบ้านๆ
C# การใช้ DateTimePicker เพื่อใช้เปรียบเทียบวันเวลาแบบบ้านๆ
C# การใช้ dateTimePicker เพื่อใช้เปรียบเทียบวันเวลาแบบบ้านๆ
Rating : Update : 2017-03-24 17:31:42
DataGridView (Win Form) สร้าง Custom แบบ Column/Header และการ Summary ผลรวม (VB.Net,C#)
DataGridView (Win Form) สร้าง Custom แบบ Column/Header และการ Summary ผลรวม (VB.Net,C#)
ตัวอย่างการใช้ DataGridview บน Windows Form Application สร้าง Custom ในส่วนของ Header หรือ Column และการ Summary ผมรวมลอง Column ที่ต้องการ
Rating : Update : 2017-03-25 13:29:14
แจก Ebook คู่มือการใช้งาน Css The Complete Reference  ฉบับสมบูรณ์ เวอร์ชัน beta
แจก Ebook คู่มือการใช้งาน Css The Complete Reference ฉบับสมบูรณ์ เวอร์ชัน beta
แจก Ebook คู่มือการใช้งาน Css The Complete Reference ฉบับสมบูรณ์ เวอร์ชัน beta
Rating : Update : 2016-10-11 13:44:07
C# การใช้งาน DataSource Wizard กับ DataGridView (Access 2007)
C# การใช้งาน DataSource Wizard กับ DataGridView (Access 2007)
ซึ่งเป็นเรื่องเกี่ยวกับการใช้ DataSource Wizard ร่วมกับ Access 2007 สำหรับบุคลที่ชอบมีปัญหา และ ต้องการตัดปัญหาในเรื่องการศึกษาเกี่ยวกับ SQL Query DataSource Wizard
Rating : Update : 2015-10-02 21:08:12
C# การใช้งาน DataTable กับ DataGridView (MS Access 2007) แบบบ้านๆ
C# การใช้งาน DataTable กับ DataGridView (MS Access 2007) แบบบ้านๆ
บทความนี้จะกล่าวถึง การใช้งาน datatable กับ DataGridView (Access 2007) แบบบ้านๆ หลังจากที่ผมใช้งาน DataSource Wizard กับ DataGridView (Access 2007)ได้แล้ว
Rating : Update : 2015-10-02 21:11:27
Android Shared Preferences (Session) : Create key/value in Application
Android Shared Preferences (Session) : Create key/value in Application
ในการใช้งาน Application บน Android ในกรณีที่ต้องการเก็บค่าตัวแปรเพื่อไปใช้งานใน Activity ต่าง ๆ นั้นเราจะใช้ Shared Preferences เป็น Class ที่ทำหน้าที่เหมือนการใช้งาน Session บน Web Application โดยความสามารถของมันคือ เมื่อเรามีการสร้างค่าตัวแปรใน App ที่ Activity
Rating : Update : 2015-11-19 13:08:56
jQuery วิธี Save State Form เมื่อกด Refresh หรือ Back แล้วข้อมูลบน Form ไม่หาย
jQuery วิธี Save State Form เมื่อกด Refresh หรือ Back แล้วข้อมูลบน Form ไม่หาย
เทคนิคการ save state ของ form เมื่อกด refresh หรือ back แล้วข้อมูลไม่หาย เหมาะสำหรับเป็น form ในการ input ข้อมูล เช่น สมัครสมาชิก ลงทะเบียน
Rating : Update : 2017-03-24 17:32:17
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
สอน jQuery การเขียนโปรแกรม ภาษา jQuery
สอน .Net การเขียนโปรแกรม ภาษา .Net
Free Tutorial
สอน Google Maps Api
สอน Windows Service
สอน 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 00
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 , 08-9968-0655 อัตราราคา คลิกที่นี่