حزمة لإطار عمل Laravel تسمح لك بتنظيم إدارة التعليقات الشبيهة بالشجرة. يتم استخدام تكافل بين طريقتين لتخزين الهياكل الهرمية - "جدول الإغلاق" و "قائمة الجوار" .
المتطلبات
Laravel 5.7 أو إطار عمل أحدث.
إصدار PHP 7.3 على الأقل.
مخزن
https://github.com/drandin/closure-table-comments
فوائد
يسمح الاستخدام المشترك لطريقتي جدول الإغلاق وقائمة التجاور بما يلي:
تقليل عدد استعلامات قاعدة البيانات. طلب واحد يكفي لاسترداد سلسلة تعليق.
تقديم أداء عالي. تعتبر طلبات القراءة إلى قاعدة البيانات بسيطة ولا تقل سرعة اختيار عقد التسلسل الهرمي عمليًا مع زيادة كمية البيانات.
قم بتخزين نص التعليق والهيكل الهرمي بشكل منفصل عن بعضهما البعض ، في جدولين.
التحكم في عمق تداخل التعليقات. دائمًا ما يكون مستوى العقد في التسلسل الهرمي معروفًا ، وليست هناك حاجة للحصول على معلومات حول أسلاف العقدة لتحديدها.
ضمان سلامة البيانات في التسلسل الهرمي. لا تتطلب إضافة عقد جديدة إلى التسلسل الهرمي أي تغييرات على روابط العقد التي تم إنشاؤها مسبقًا.
SQL-. , , .
. .
«Adjacency List», , .
«Path Enumeration», «Materialized Path» - SQL- SELECT, LIKE : '%/2/3/4%'. , .
— «Nested Sets». , . . «Nested Sets».
«Closure Table» , «» — .
«Closure Table» «Adjacency List» .
«Closure Table» «Adjacency List»:

«Closure Table» .
«Adjacency List» .
, , .
1. Laravel :
composer require drandin/closure-table-comments
2. config/app.php -. 'providers'.
\Drandin\ClosureTableComments\ClosureTableServiceProvider::class,3. , closure-table-comments.php config :
php artisan vendor:publish --tag=config
, config/closure-table-comments.php . , , .
4. , :
php artisan config:cache
5. . , :
php artisan migrate
2 .
, .
, , «» , .
Comment StructureTree.
subject_id — «». NULL.
subject_id NULL, - .
user_id — « ». NULL.
user_id NULL, - . .
1. .
, «» 5636 7 .
use Drandin\ClosureTableComments\ClosureTableService;
use Drandin\ClosureTableComments\Commentator;
$commentator = new Commentator(new ClosureTableService());
$comment = " . .";
$id = $commentator
->setSubjectId(5636)
->addCommentToRoot($comment, 7);$id, 5636. 7.
2. , .
, «» 5636 43 .
( Node), . , 1.
use Drandin\ClosureTableComments\ClosureTableService;
use Drandin\ClosureTableComments\Commentator;
$commentator = new Commentator(new ClosureTableService());
$comment = " , .";
$id = $commentator
->setSubjectId(5636)
->replyToComment(1, $comment, 43);$id, 5636. 43.
, ( 1). , (level) , .
3. .
.
use Drandin\ClosureTableComments\ClosureTableService;
use Drandin\ClosureTableComments\Commentator;
$commentator = new Commentator(new ClosureTableService());
$comment = " . .";
$res = $commentator->editComment(1, $comment);, $res true.
4. .
( ) .
use Drandin\ClosureTableComments\ClosureTableService;
use Drandin\ClosureTableComments\Commentator;
$commentator = new Commentator(new ClosureTableService());
$res = $commentator->has(2);2 , $res true.
5. ( ) .
, Node , 2.
use Drandin\ClosureTableComments\ClosureTableService;
use Drandin\ClosureTableComments\Commentator;
$commentator = new Commentator(new ClosureTableService());
$node = $commentator->getNode(2);, 2 , getNode Node. Node .
6. .
5636, . . , .
, . . . , , .
getTreeBranch.
use Drandin\ClosureTableComments\ClosureTableService;
use Drandin\ClosureTableComments\Commentator;
$commentator = new Commentator(new ClosureTableService());
$nodes = $commentator
->setSubjectId(5636)
->getTreeBranch();Node.
, getTreeBranch .
use Drandin\ClosureTableComments\ClosureTableService;
use Drandin\ClosureTableComments\Commentator;
$commentator = new Commentator(new ClosureTableService());
$nodes = $commentator
->setSubjectId(5636)
->getTreeBranch(2);2.
7. .
getTreeBranchArray.
use Drandin\ClosureTableComments\ClosureTableService;
use Drandin\ClosureTableComments\Commentator;
$commentator = new Commentator(new ClosureTableService());
$tree = $commentator
->setSubjectId(5636)
->getTreeBranchArray();, , getTreeBranchArray .
8. .
, 23.
use Drandin\ClosureTableComments\ClosureTableService;
use Drandin\ClosureTableComments\Commentator;
$commentator = new Commentator(new ClosureTableService());
$ids = $commentator->getBranchIds(23);$ids .
9. .
, 23 , Node getNode , . , getLevel.
use Drandin\ClosureTableComments\ClosureTableService;
use Drandin\ClosureTableComments\Commentator;
$commentator = new Commentator(new ClosureTableService());
$level = $commentator->getLevel(23);10. () .
( ), delete.
delete , , .
64 , .
use Drandin\ClosureTableComments\ClosureTableService;
use Drandin\ClosureTableComments\Commentator;
$commentator = new Commentator(new ClosureTableService());
$res = $commentator->delete(64);, .
«Closure Table»
«Closure Table» , , . , . , , .
, , «Closure Table» , .
, .
, , , , .
, . , , , .
, , , .
«Closure Table» «Adjacency List» https://habr.com/ru/post/263629/. 2015 .
«Stack Overflow». MySQL Closure Table hierarchical ? http://stackoverflow.com/questions/8252323/mysql-closure-table-hierarchical-database-how-to-pull-information-out-in-the-c, ? http://stackoverflow.com/questions/192220/what-is-the-most-efficient-elegant-way-to-parse-a-flat-table-into-a-tree.
(Bill Karwin). http://www.slideshare.net/billkarwin/models-for-hierarchical-data.
تخزين الأشجار في قاعدة البيانات. الجزء الأول النظري https://habr.com/ru/post/193166/ . عام 2013.