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

WBOY
Freigeben: 2016-06-20 12:28:35
Original
1104 Leute haben es durchsucht

本文经授权转自 PHPHub 社区

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

说明

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

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

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

file

用例说明

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

标签系统

参考:Laravel Taggable 为你的模型添加打标签功能一个标签可以有无数多子标签,属于一个父标签,有多个同辈标签。

如下面的这颗标签树:

$tagTree = [    'name' => 'RootTag',    'children' => [        ['name' => 'L1Child1',            'children' => [                ['name' => 'L2Child1'],                ['name' => 'L2Child1'],                ['name' => 'L2Child1'],            ]        ],        ['name' => 'L1Child2'],        ['name' => 'L1Child3'],    ]];
Nach dem Login kopieren

评论系统

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

file

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

「导航栏」数据模型

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

file

集成 Baum

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

接下来我们讲如何集成。

1. composer 安装

composer require "baum/baum:~1.1"
Nach dem Login kopieren

2. 增加 provider

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

'Baum\Providers\BaumServiceProvider',
Nach dem Login kopieren

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

3. 创建 migration

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

php artisan baum:install MODEL
Nach dem Login kopieren

然后执行

php artisan migrate
Nach dem Login kopieren

关于 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();    });  }}
Nach dem Login kopieren

4. 配置数据模型

继承 Baum\Node

class Category extends Baum\Node {}
Nach dem Login kopieren

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

class Category extends Baum\Node {  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');}
Nach dem Login kopieren

至此集成成功。

使用

引用: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);
Nach dem Login kopieren

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

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!