indigoram89/laravel-nested-set
Composer 安装命令:
composer require indigoram89/laravel-nested-set
包简介
Laravel package for managing hierarchical data using Nested Set pattern with drag-and-drop interface
README 文档
README
Пакет для управления иерархическими данными в Laravel с использованием паттерна Nested Set. Включает современный веб-интерфейс на Vue.js 3 с поддержкой drag-and-drop и REST API.
Требования
- PHP 8.4+
- Laravel 12.x
Установка
Через Composer из GitHub
composer require indigoram89/laravel-nested-set
Публикация конфигурации
php artisan vendor:publish --tag=nested-set-config
Публикация миграций
php artisan vendor:publish --tag=nested-set-migrations php artisan migrate
Публикация views (опционально)
php artisan vendor:publish --tag=nested-set-views
Публикация assets для веб-интерфейса
php artisan vendor:publish --tag=nested-set-assets
Использование
Создание модели
Создайте модель, наследующую NestedSetModel:
<?php namespace App\Models; use Indigoram89\NestedSet\Models\NestedSetModel; class Category extends NestedSetModel { protected $table = 'categories'; protected $fillable = ['name', 'slug']; }
Или используйте trait в существующей модели:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Indigoram89\NestedSet\Traits\NestedSetTrait; class Category extends Model { use NestedSetTrait; protected $fillable = ['name', 'slug']; }
Миграция
Создайте миграцию для вашей таблицы:
Schema::create('categories', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('parent_id')->nullable()->index(); $table->integer('lft')->default(0)->index(); $table->integer('rgt')->default(0)->index(); $table->unsignedInteger('depth')->default(0); $table->string('name'); $table->string('slug')->nullable()->index(); $table->timestamps(); $table->index(['lft', 'rgt']); $table->index(['parent_id', 'lft']); });
Основные операции
Создание корневого узла
$root = Category::create(['name' => 'Root Category']); $root->makeRoot();
Создание дочернего узла
$child = Category::create(['name' => 'Child Category']); $child->makeChildOf($parent);
Перемещение узлов
// Переместить слева от узла $node->moveToLeftOf($target); // Переместить справа от узла $node->moveToRightOf($target); // Сделать дочерним узлом $node->makeChildOf($parent);
Получение данных
// Получить всех потомков $descendants = $node->getDescendants(); // Получить всех предков $ancestors = $node->getAncestors(); // Получить прямых потомков $children = $node->getChildren(); // Получить родителя $parent = $node->getParent(); // Получить соседние узлы $siblings = $node->getSiblings(); // Получить путь до узла $path = $node->getPath(); // Получить все дерево $tree = Category::query()->getTree();
Проверки
// Является ли узел корневым $node->isRoot(); // Является ли узел листом (без потомков) $node->isLeaf(); // Проверка целостности дерева $node->isValidNestedSet();
Удаление
// Удалить узел с потомками $node->deleteSubtree();
Scopes
// Получить корневые узлы Category::query()->roots()->get(); // Получить листья Category::query()->leaves()->get(); // Получить узлы определенной глубины Category::query()->withDepth(2)->get();
Веб-интерфейс на Vue.js
Пакет включает современный веб-интерфейс для управления деревьями с использованием Vue.js 3, Tailwind CSS и REST API.
Возможности
- 🎯 Выбор модели для управления
- 🌳 Визуализация дерева с анимациями
- 🔍 Поиск по дереву
- ➕ Создание новых узлов
- ✏️ Редактирование существующих узлов
- 🗑️ Удаление узлов с подтверждением
- 🔄 Drag & Drop для перемещения узлов
- 📱 Адаптивный дизайн
Установка веб-интерфейса
- Опубликуйте конфигурацию и assets:
# Опубликовать всё php artisan vendor:publish --provider="Indigoram89\NestedSet\NestedSetServiceProvider" # Или по отдельности: php artisan vendor:publish --tag=nested-set-config php artisan vendor:publish --tag=nested-set-assets
- Настройте модели в файле
config/nested-set.php:
'models' => [ [ 'name' => 'category', 'class' => App\Models\Category::class, 'label' => 'Категории', 'description' => 'Управление категориями товаров', ], [ 'name' => 'menu', 'class' => App\Models\MenuItem::class, 'label' => 'Меню', 'description' => 'Управление пунктами меню', ], ],
- Откройте в браузере:
http://your-app.test/nested-set
API Endpoints
Интерфейс использует следующие API endpoints:
GET /api/nested-set/models- получить список моделейGET /api/nested-set/{model}/tree- получить деревоPOST /api/nested-set/{model}/nodes- создать узелPUT /api/nested-set/{model}/nodes/{id}- обновить узелDELETE /api/nested-set/{model}/nodes/{id}- удалить узелPOST /api/nested-set/{model}/reorder- переупорядочить узлы
Безопасность
- Все запросы защищены CSRF токеном
- Валидация на стороне сервера
- Защита от циклических ссылок при перемещении узлов
Добавление аутентификации
Для защиты интерфейса добавьте middleware в маршруты:
Route::prefix('nested-set') ->middleware(['web', 'auth', 'can:manage-trees']) ->group(function () { Route::get('/', [NestedSetWebController::class, 'index']); });
Конфигурация
Файл конфигурации config/nested-set.php:
return [ // Названия колонок 'columns' => [ 'left' => 'lft', 'right' => 'rgt', 'depth' => 'depth', 'parent_id' => 'parent_id', ], // Имя таблицы по умолчанию 'table' => 'nested_sets', // Модели для веб-интерфейса 'models' => [ // Добавьте ваши модели здесь ], // Настройки производительности 'cache' => [ 'enabled' => true, 'ttl' => 3600, 'prefix' => 'nested_set_', ], ];
Примеры использования
Построение меню навигации
$categories = Category::query()->roots()->get(); foreach ($categories as $root) { echo $root->name; foreach ($root->getChildren() as $child) { echo '-- ' . $child->name; foreach ($child->getChildren() as $grandchild) { echo '---- ' . $grandchild->name; } } }
Хлебные крошки
$category = Category::find($id); $breadcrumbs = $category->getPath(); foreach ($breadcrumbs as $crumb) { echo $crumb->name . ' > '; }
Перестроение дерева
Если структура дерева была повреждена:
$model = new Category(); $model->rebuild();
Тестирование
Запустите тесты:
vendor/bin/phpunit
Лицензия
MIT License
indigoram89/laravel-nested-set 适用场景与选型建议
indigoram89/laravel-nested-set 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1 次下载、GitHub Stars 达 1, 最近一次更新时间为 2025 年 07 月 20 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「tree」 「laravel」 「hierarchy」 「nested-set」 「drag-and-drop」 「livewire」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 indigoram89/laravel-nested-set 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 indigoram89/laravel-nested-set 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 indigoram89/laravel-nested-set 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
jsTree widget for yii2
Adjacency List’ed Closure Table database design pattern implementation for Laravel. Includes restore of tree
Doctrine2 behavior traits - slowhop fork
A library to extend Object capabilities.
Nested Set Model for Laravel 12+ (Lunar-maintained fork of kalnoy/nestedset)
Implementing Nested-structure Hierarchy Categories system for Eloquent models.
统计信息
- 总下载量: 1
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 1
- 点击次数: 20
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2025-07-20