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,405




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

Nested Set model ข้อมูลเชิงซ้อนโครงสร้างต้นไม้

 
 
       
Bookmark.   
Share
       
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





  By : mr.v
  Article : บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ
  Score Rating :
  Create Date : 2016-08-28
  Download : No files
Sponsored Links
 

Sponsored Links
แจกฟรี Script ส่งอีเมล์แบบ SMTP / POP ของ PHP ที่สามารถใช้งานได้จริง ๆ
แจกฟรี Script ส่งอีเมล์แบบ SMTP / POP ของ PHP ที่สามารถใช้งานได้จริง ๆ
เห็นถามกันบ่อย ๆ ในกระทู้ เวลาเขียน script ด้วย php แล้วส่งอีเมล์ ด้วย function mail() แล้วไม่สามารถใช้งานได้ หรือ ส่งไปแล้วปลายทางอาจจะไม่ได้รับ อาจจะด้วยสาเหตุ Server ติด Blacklist หรืออื่น ๆ
Rating : Update : 2015-02-10 13:53:01
ตอนที่ 4 : MongoLab สร้าง Mongo Database จาก Store (Azure Add-ons)
ตอนที่ 4 : MongoLab สร้าง Mongo Database จาก Store (Azure Add-ons)
สำหรับ MongoLab เป็น Service แบบ Hosting แบบ Cloud Database (database-as-a-service ) ของ Mongo และใช้ Engine ของ Mongo ทุกประการ การเขียนโปรแกรมและการเรียกใช้งานก็เช่นเดียวกัน โดยเราสามารถสร้าง Service ของ MongoLab
Rating : Update : 2013-12-04 10:44:04
Android AsyncTask update ListView notifyDataSetChanged when Items Load finish
Android AsyncTask update ListView notifyDataSetChanged when Items Load finish
ในการแสดงผลข้อมูลจาก Server บน ListView บน Android นั้นปกติถ้าใช้การดึงแบบปกติด้วยการใช้ BaseAdapter หรือ Adapter อื่น ๆ ตัว ListView จะต้องรอให้ข้อมูลทุกรายการโหลดให้เรียบร้อยก่อนที่จะแสดงผล ซึ่งถ้าอัตราการโหลดข้อมูลช้า โปรแกรมก็จะค้างไปซะพัก และรอจนกว่าโปรแกรมทำงานเสร็จสิ้นถึงจะแสดงผลออกมา
Rating : Update : 2013-11-13 10:45:13
Simple add/delete table row with jQuery by PlaKriM
Simple add/delete table row with jQuery by PlaKriM
เขียนให้ดูเล่นๆ เพิ่มแถวของเทเบิ้ลด้วยการ jquery clone และลบแถวของเทเบิ้ลด้วย jquery
Rating : Update : 2011-09-20 21:50:39
สร้าง Project ของ iOS 7 บน Xcode 5 และการปรับแต่ง Simulator
สร้าง Project ของ iOS 7 บน Xcode 5 และการปรับแต่ง Simulator
การเขียน App iOS บน Version ของ iOS 7 และ Tools ของ Xcode 5 ซึ่งช่วยให้การเขียน App บน iOS นั้นง่ายและสะดวกมาก ๆ
Rating : Update : 2014-03-23 12:46:45
ระบบ 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


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
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 04
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2015 All Rights Reserved.
for Contact Us : [Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 , 084-715-5121 อัตราราคา คลิกที่นี่

Back to Top