drandin/closure-table-comments

用于管理层次树状评论的系统。使用“闭包表”方法结合“邻接表”将层次树状结构存储在数据库中。

0.1 2020-08-20 08:04 UTC

This package is auto-updated.

Last update: 2024-09-20 17:07:27 UTC


README

Laravel 提供管理层次树状评论的系统。

树状层次结构存储在关系型数据库中。获取树节点时不使用递归SQL查询。

使用“闭包表”和“邻接表”方法组织评论结构。

树元素关系的“闭包表”模式

Схема связей элементов дерева «Closure Table»

“闭包表”方法具有许多优点,不允许从数据库中检索树状层次结构的节点并有效地构建排序正确的树。为克服这一限制,将“闭包表”方法与“邻接表”方法相结合。

“邻接表”邻接列表 — 以顶点集合的形式表示图的一种方式。每个图的顶点对应一个包含该顶点“邻居”的列表。

安装

composer require drandin/closure-table-comments
安装包后,需要按顺序执行以下操作

将服务提供者添加到应用程序配置文件 config/app.php 中。以下行应添加到 'providers' 数组中。

 \Drandin\ClosureTableComments\ClosureTableServiceProvider::class,

在控制台中执行命令,将配置文件 closure-table-comments.php 复制到应用程序的 config 目录

 php artisan vendor:publish --tag=config

(!) 执行该命令后,您可以在 config/closure-table-comments.php 文件中更改数据库和表名。如果需要,请在此处调整配置参数,然后再继续。

在控制台中执行命令

 php artisan config:cache

在控制台中执行命令,以启动迁移执行

 php artisan migrate

结果将在数据库中创建 2 个表。

使用

每个评论可以关联到一个特定对象,并可以链接到撰写评论的作者。例如,如果需要在新闻网站上组织文章的讨论,则可以使用文章的唯一整数标识符作为指示评论属于讨论对象的依据,而用户的整数标识符则指明评论的作者。

subject_id — 文章的整数标识符。可能为 NULL。如果 subject_idNULL,则评论不关联到任何对象。

user_id — 文章作者的整数标识符。可能为 NULL。如果 user_idNULL,则评论不属于任何作者。这类评论可以视为匿名评论。

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(2332)
       ->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);

如果树结构中存在具有唯一标识符的评论,则变量 $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);

9. 通过唯一标识符获取节点级别

假设我们需要知道在树结构中节点 23 的级别,但我们想要使用方法 getLevel 获取对象 Node,因为我们只需要关于级别的信息。为此,应使用方法 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);

请注意,删除的评论无法恢复。

许可证(License)

MIT 许可证