Un paquete para el framework Laravel que te permite organizar la gestión de comentarios en forma de árbol. Se utiliza una simbiosis de dos métodos para almacenar estructuras jerárquicas: "Tabla de cierre" y "Lista de adyacencia" .
Requisitos
Laravel 5.7 o un marco más reciente.
La versión de PHP es al menos 7.3.
Repositorio
https://github.com/drandin/closure-table-comments
Beneficios
El uso combinado de los métodos de tabla de cierre y lista de adyacencia permite:
Minimice el número de consultas a la base de datos. Una solicitud es suficiente para recuperar un hilo de comentarios.
Proporcionar alto rendimiento. Las solicitudes de lectura a la base de datos son simples y la velocidad de selección de nodos de jerarquía prácticamente no disminuye con un aumento en la cantidad de datos.
Almacene el texto del comentario y la estructura jerárquica por separado, en dos tablas.
Controle la profundidad de anidación de comentarios. Siempre se conoce el nivel de los nodos en la jerarquía; no es necesario obtener información sobre los antepasados de un nodo para determinarlo.
Asegurar la integridad de los datos de la jerarquía. Agregar nuevos nodos a la jerarquía no requiere ningún cambio en los enlaces de los nodos creados previamente.
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.
Almacenar árboles en la base de datos. Primera parte, https://habr.com/ru/post/193166/ teórico . Año 2013.