PHP code example of jiaxincui / closure-table
1. Go to this page and download the library: Download jiaxincui/closure-table library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
jiaxincui / closure-table example snippets
$menu = Menu::find(2);
// 将$menu作为根,return bool
$menu->makeRoot();
// 创建一个子级节点,return new model
$menu->createChild($attributes);
// 创建一个新的节点,该节点为根(如果未指定 parent 列)
$child = Menu::create($attributes);
// 将一个已存在的节点添加到子级,$child参数可以是模型实例/id,return void
$menu->addChild($child);
$menu->addChild(12);
// 移动到$parent的下级,它的所有下级节点也将随之移动,$parent参数可以是模型实例/id,return void
$menu->moveTo($parent);
$menu->moveTo(2);
// 添加一个或多个同级节点,$sibling的所有下级节点也将随之移动,$siblings可以是模型实例/id,return void
$menu->addSibling($sibling);
$menu->addSibling(2);
// 新建一个同级节点,return Model
$menu->createSibling($attributes);
$menu = Menu::find(3);
// 获取所有后代,返回列表
$menu->getDescendants();
// 获取所有后代,包括自己,返回列表
$menu->getDescendantsAndSelf();
// 获取所有祖先,返回列表
$menu->getAncestors();
// 获取所有祖先,包括自己,返回列表
$menu->getAncestorsAndSelf();
// 获取所有儿女(直接下级),返回列表
$menu->getChildren();
// 获取上级节点,返回单个实例/null
$menu->getParent();
// 获取根(根节点返回本身),返回单个实例/null
$menu->getRoot();
// 获取所有同级节点, 返回列表
$menu->getSiblings();
//获取所有同级节点并包括本身,返回列表
$menu->getSiblingsAndSelf();
// 获取所有孤立节点(孤立节点指在没有在 closureTable 表里维护的记录)
Menu::onlyIsolated()->get();
// 获取所有根, 返回列表
Menu::onlyRoot()->get();
$menu = Menu::find(3);
// 从当前节点生成树,return tree array
$menu->getTree();
// 当前节点作为根生成树,以sort字段排序,return array tree
$menu->getTree(['sortColumn', 'desc']);
// 同上,return tree array
$menu->getDescendantsAndSelf()->toTree();
// 获取到以所有children为根的multi tree array
$menu->getDescendants()->toTree();
// 从根节点生成树,return tree array
$menu->getRoot()->getTree();
//旁树,不包含自己和下级,return tree array
$menu->getBesideTree();
[
[
'id' => 3,
'name' => 'node3',
'children' => [
[
'id' => 4,
'name' => 'node4'
],
[
'id' => 5,
'name' => 'node5'
'children' => [
[
'id' => 6,
'name' => 'node6'
]
]
]
]
]
]
$multiTree = Menu::all()->toTree();
var_dump($multiTree);
$menu = Menu::find(3);
// 是否根
$menu->isRoot();
// 是否叶子节点
$menu->isLeaf();
// 是否孤立节点
$menu->isIsolated();
// 是否某的上级
$menu->isAncestorOf($descendant);
// 是否某的下级
$menu->isDescendantOf($ancestor);
// 是否某的直接下级
$menu->isChildOf($parent);
// 是否某的直接上级
$menu->isParentOf($child);
// 是否某的同级(同一个上级)
$menu->isSiblingOf($sibling);
// 如果$beside不是自己,也不是自己的后代返回true
$menu->isBesideOf($beside);
$menu->delete();
// 清理冗余的关联信息
Menu::deleteRedundancies();
$menu = Menu::find(20);
// 修复此节点的关联, 它将重新建立 `closure` 表里的记录
$menu->perfectNode();
// 修复树关联,注意:这个操作将追朔到到根节点然后从根遍历整颗树调用perfectNode(),如果你的树很庞大将耗费大量资源,请慎用.
// 解决方案是使用队列对每个节点使用 perfectNode()
$menu->perfectTree();
Schema::create('menus', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
// parent 列允许为 null,因为根节点的 parent 为 null,
// !!!根节点的 parent 一定为 null,请勿自定义为其它值
$table->unsignedInteger('parent')->nullable();
});
Schema::create('menu_closure', function (Blueprint $table) {
$table->unsignedInteger('ancestor');
$table->unsignedInteger('descendant');
$table->unsignedTinyInteger('distance');
$table->primary(['ancestor', 'descendant']);
});
namespace App;
use Illuminate\Database\Eloquent\Model;
use Jiaxincui\ClosureTable\Traits\ClosureTable;
class Menu extends Model
{
// (必要)引入ClosureTable.
use ClosureTable;
// (非必要)关联表名,默认'Model类名+_closure',如'menu_closure'
protected $closureTable = 'menu_closure';
// (非必要)ancestor列名,默认'ancestor'
protected $ancestorColumn = 'ancestor';
// (非必要)descendant列名,默认'descendant'
protected $descendantColumn = 'descendant';
// (非必要)distance列名,默认'distance'
protected $distanceColumn = 'distance';
// (非必要)parent列名,默认'parent', 要求此列可以为`null`
protected $parentColumn = 'parent';
}