Laravel中的嵌套集是今天的主题的嵌套集模型是根据树遍历对节点进行编号,遍历每个节点两次,按访问顺序分配编号,并在两次访问时分配。这为每个节点留下了两个数字编号,它们存储为两个属性。查询变得更便宜:可以通过比较这些数字来测试层次结构成员资格。 更新则需要重新编号。
什么是 Nested Set
嵌套集或嵌套集模型(NSM)是有效地将分层数据存储在关系表中的方法。
用例
当树很少更新时,NSM显示出良好的性能。 它被创建为快速获取相关节点。
它非常适合为商店构建多个深度菜单或类别。
关系
嵌套集是一个填充了不同节点的树结构。 所以他们之间的关系如下。
- 节点属于父节点
- 节点有许多子节点
- 节点有很多祖先
- 节点有很多后代
Nested Set 在Laravel中的例子
我们将使用以下命令安装Framework来开始此Laravel 5.7嵌套集教程。
Step 1: 安装Laravel
我正在使用Valet
。 所以,我需要输入以下命令来创建一个项目。
laravel new nestedset
当然如果你没有用Homestead
或者Valet
, 你也可以用下面的命令。
composer create-project laravel/laravel nestedset --prefer-dist
安装好后进入项目目录。
cd nestedset
在.env
文件中配置你的数据库。
Step 2: 安装 laravel-nestedset composer 包。
又可以在这里找到官方的Github仓库。
使用下面的composer
命令来安装。
composer require kalnoy/nestedset
装好了后,我们来配置下它。
首先,我们正在努力建立一个电子商务商店。所以这是一个完美的场景,我们可以使用嵌套集,因为我们有第一个类别,然后是子类别和子子类别等等。 所以我们试图制作一个列表,其中,根是主要类别,然后它的所有子节点都是子类别。
Step 3: 创建一个模型和数据库迁移。
在你的终端中,使用如下命令:
php artisan make:model Shop -m
上面的命令就是同时生产模型和迁移文件的。
现在,在迁移文件中,我们需要添加一些由嵌套集库提供的额外列。
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
// 以下仅在laravel版本小于5.5时用
// use Kalnoy\Nestedset\NestedSet;
class CreateShopsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('shops', function (Blueprint $table) {
$table->increments('id');
$table->string('category_name');
// NestedSet::columns($table); //低于laravel 5.5的老版本用这个命令
$table->nestedSet();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('shops');
}
//以下的命令只单独删除Nested Set的字段,不会删除表,注意!
// public function down()
// {
// Schema::table('shops', function (Bluep