资讯专栏INFORMATION COLUMN

使用 Baum 嵌套集合模型来实现 Laravel 模型的无限极分类

superPershing / 2617人阅读

摘要:本文经授权转自社区使用嵌套集合模型来实现模型的无限极分类说明大家通常都是使用递归实现无限极分类,都知道递归效率很低,下面推荐一个的扩展包,快速让你的数据模型支持无限极树状层级结构,并且兼顾效率。

本文经授权转自 PHPHub 社区

使用 Baum 嵌套集合模型来实现 Laravel 模型的无限极分类

说明

大家通常都是使用递归实现无限极分类,都知道递归效率很低,下面推荐一个 Laravel 的扩展包 etrepat/baum,快速让你的数据模型支持无限极树状层级结构,并且兼顾效率。

更多 嵌套集合模型(Nested set model)的介绍请见:wiki

扩展包的 官方文档 里有解释的篇幅,下面这张图的也是一个简单的例子:

用例说明

接下来讲几个无限树状层级模型的例子。

标签系统

参考:Laravel Taggable 为你的模型添加打标签功能

一个标签可以有无数多子标签,属于一个父标签,有多个同辈标签。

如下面的这颗标签树:

$tagTree = [
    "name" => "RootTag",
    "children" => [
        ["name" => "L1Child1",
            "children" => [
                ["name" => "L2Child1"],
                ["name" => "L2Child1"],
                ["name" => "L2Child1"],
            ]
        ],
        ["name" => "L1Child2"],
        ["name" => "L1Child3"],
    ]
];
评论系统

评论的无限极别嵌套,如网易的 跟帖系统。

Laravel 有一个评论扩展包支持无限极别嵌套,请见 Slynova-Org/laravel-commentable。

「导航栏」数据模型

管理员后台需要提供「导航栏」自定义功能,树状结构导航栏。

集成 Baum

etrepat/baum 快速让你的数据模型支持无限极树状层级结构,且兼顾效率。

接下来我们讲如何集成。

1. composer 安装
composer require "baum/baum:~1.1"
2. 增加 provider

修改 config/app.php 文件,在 providers 数组中添加:

"BaumProvidersBaumServiceProvider",

此服务提供者注册了两个命令:artisan baum, artisan baum.install

3. 创建 migration

安装到已存在的数据模型上:

php artisan baum:install MODEL

然后执行

php artisan migrate
关于 migration 的字段介绍

parent_id: 父节点的 id

lft: 左边索引值

rgt: 右边索引值

depth: 层级深度

下面是个例子:

class Category extends Migration 
{
  public function up() {
    Schema::create("categories", function(Blueprint $table) {
      $table->increments("id");
        
         // 这四行代码
      $table->integer("parent_id")->nullable();
      $table->integer("lft")->nullable();
      $table->integer("rgt")->nullable();
      $table->integer("depth")->nullable();

      $table->string("name", 255);

      $table->timestamps();
    });
  }
}
4. 配置数据模型

继承 BaumNode

class Category extends BaumNode 
{
}

继承后有这些属性可以重写:

class Category extends BaumNode 
{
  protected $table = "categories";

  // "parent_id" column name
  protected $parentColumn = "parent_id";

  // "lft" column name
  protected $leftColumn = "lidx";

  // "rgt" column name
  protected $rightColumn = "ridx";

  // "depth" column name
  protected $depthColumn = "nesting";

  // guard attributes from mass-assignment
  protected $guarded = array("id", "parent_id", "lidx", "ridx", "nesting");
}

至此集成成功。

使用

引用:https://phphub.org/topics/2123

集成 etrepat/baum 让标签具备从属关系。

$root = Tag::create(["name" => "Root"]);

// 创建子标签
$child1 = $root->children()->create(["name" => "Child1"]);

$child = Tag::create(["name" => "Child2"]);
$child->makeChildOf($root);

// 批量构建树
$tagTree = [
    "name" => "RootTag",
    "children" => [
        ["name" => "L1Child1",
            "children" => [
                ["name" => "L2Child1"],
                ["name" => "L2Child1"],
                ["name" => "L2Child1"],
            ]
        ],
        ["name" => "L1Child2"],
        ["name" => "L1Child3"],
    ]
];

Tag::buildTree($tagTree);

更多关联操作请查看:etrepat/baum 。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21568.html

相关文章

  • Laravel Taggable 为你模型添加打标签功能

    摘要:标签名称规则说明标签名里的特殊符号和空格会被替代智能标签生成,会生成对应的中文拼音,如标签,拼音一样的时候会被加上随机值标签名清理使用。 本文经授权转自 PHPHub 社区 功能说明 使用最简便的方式,为你的数据模型提供强大「打标签」功能。 项目地址:https://github.com/summerblue/laravel-taggable 本项目修改于 rtconner/lar...

    lucas 评论0 收藏0
  • 分层数据Hierarchical Data探索(1.递归)

    摘要:分层数据探索例如无限级分类多级菜单省份城市引言什么是分层数据类似于树形结构,除了根节点和叶子节点外,所有节点都有一个父节点和一个或多个子节点。接下来我会先通过一般方法和递归方法来实现无限极分类,然后再通过两种数据模型来谈一谈分层数据的处理。 分层数据Hierarchical Data探索(例如:无限级分类、多级菜单、省份城市) 引言 什么是分层数据? 类似于树形结构,除了根节点和叶子节...

    yzd 评论0 收藏0
  • 【日常手记】之Laravel5.3

    摘要:个人网站最近刚写了一个手机在线播放的电影站使用日常手记更新使用的的查询作用域的本地作用域去自定义可复用的约束集合,方便链式调用什么是本地查询作用域本地作用域允许我们定义通用的约束集合以便在应用中复用。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和够用是最完美的追求。 个人网站:...

    kidsamong 评论0 收藏0
  • 下载量最高 100 个 Laravel 扩展包推荐

    摘要:本文经授权转自社区,后续更新将以帖子内容和内容为准。说明另一个令人喜欢的地方,是拥有活跃的开发者社区,而活跃的开发者社区带来的,是繁华的扩展包生态。本文对上打了标签的扩展包进行整理,截止到现在年月号,有超过个扩展包,以下是下载量最大的个。 本文经授权转自 PHPHub 社区,后续更新将以 PHPHub 帖子内容 和 GitHub 内容 为准。 说明 Laravel 另一个令人喜欢的地方...

    Tychio 评论0 收藏0
  • laravel-nestedset:多级无限分类正确姿势

    摘要:通过自定义的查询加载和大多数情况下,你需要按层级排序祖先集合可以被预加载视图模板中面包屑将祖先的全部取出后转换为数组,在用拼接为字符串输出。 原文链接:http://www.pilishen.com/posts...; 欢迎作客我们的php&Laravel学习群:109256050 laravel-nestedset是一个关系型数据库遍历树的larvel4-5的插件包 目录: Nes...

    pf_miles 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<