讲师中心 微信公众号
AI工具推荐 视频效率加速

Laravel8.x无限级分类怎么实现拖拽排序

浅宇吖_3772

浅宇吖_3772

发布时间:2026-10-29 15:23:31

|

929人浏览过

|

来源于php中文网

原创

Laravel 8.x 实现无限级分类拖拽排序需采用路径字段或闭包表替代 parent_id,后端提供树形接口并接收前端提交的扁平化有序ID列表,事务中更新 path/depth/order_column;前端用 SortableJS 维护层级状态,注意安全校验与体验优化。

laravel8.x无限级分类怎么实现拖拽排序

在 Laravel 8.x 中实现无限级分类的拖拽排序,核心在于:**后端提供结构化数据接口 + 前端使用支持嵌套拖拽的 UI 组件(如 SortableJS)+ 后端接收并安全更新节点位置与层级关系**。关键不是单纯“拖拽”,而是拖拽后如何准确还原树形结构并持久化到数据库。

一、数据库设计:推荐使用「闭包表(Closure Table)」或「路径字段(Path/Slug)」

传统 parent_id 单字段在拖拽重排时容易引发循环引用、层级错乱、性能差等问题。Laravel 8 推荐用更健壮的方式:

  • 闭包表方案:额外建一张 category_ancestors 表,记录任意两个节点间的祖先-后代关系及深度。适合频繁移动、跨层级拖拽,查询灵活但写入稍重。
  • 路径字段方案(更轻量常用):在分类表中增加 path 字段(如 "001.005.012"),用固定长度编号拼接表示完整路径;再加 depth 和 order_column(用于同级排序)。拖拽时只需更新 path、depth、order_column 三字段,查询也极快。

不建议仅靠 parent_id + sort 实现复杂拖拽——深层嵌套下递归计算易超时,移动节点时需批量更新大量子节点 sort 值,事务风险高。

二、后端接口:提供树形数据 + 接收扁平化拖拽结果

前端拖拽插件(如 SortableJS 配合 nested-sortable)最终提交的是一个**扁平化的有序 ID 列表**,含缩进层级信息(例如通过 level 或 parent_id 字段标识隶属关系)。

你需要一个 POST 接口(如 POST /admin/categories/sort)接收类似这样的 JSON:

laravel-specialist
laravel-specialist

精通 Laravel 10+,遵循现代 PHP 实践的 Laravel 专家。擅长优雅语法、Eloquent ORM、队列系统及企业级特性...

下载
[
  {"id": 1, "parent_id": null, "level": 0, "order": 1},
  {"id": 3, "parent_id": 1, "level": 1, "order": 1},
  {"id": 7, "parent_id": 3, "level": 2, "order": 1},
  {"id": 5, "parent_id": 1, "level": 1, "order": 2},
  {"id": 2, "parent_id": null, "level": 0, "order": 2}
]

后端逻辑要点:

  • 校验所有 ID 真实存在且属于当前用户/租户;
  • 按 level 和 order 重建树结构,逐个计算每个节点的 path(如根节点为 "001",其子节点为 "001.001"、"001.002");
  • 用事务批量更新:先锁表或加行锁,再依次更新每条记录的 path、depth、parent_id、lft/rgt(如果用嵌套集)或 order_column;
  • 返回成功或明确错误(如循环引用检测失败)。

三、前端实现:用 SortableJS + 手动维护层级状态

不要依赖纯 CSS 缩进,而要让每个拖拽项携带可解析的层级元数据:

  • 渲染列表时,为每个 <li> 添加 data-id、data-parent-id、data-level 属性;
  • 初始化 SortableJS 时启用 group: { name: 'nested', put: true } 和 animation: 150;
  • 监听 end 事件,遍历 DOM 获取当前顺序,根据元素缩进(如 margin-left 或 class 名中的 level-2)推算 level,再向上查找最近的非同级父元素确定 parent_id;
  • 拼装好上述扁平结构后,用 Axios 提交到后端排序接口。

示例片段(简化):

const sortable = new Sortable(el, {
  handle: '.drag-handle',
  animation: 150,
  onEnd({ item }) {
    const data = Array.from(el.children).map((el, i) => ({
      id: +el.dataset.id,
      parent_id: el.dataset.parentId === 'null' ? null : +el.dataset.parentId,
      level: +el.dataset.level,
      order: i + 1
    }));
    axios.post('/admin/categories/sort', data);
  }
});

四、安全与体验细节不能漏

  • 防重复提交:按钮点击后置灰,接口响应后再恢复;后端对同一请求做幂等性校验(如传入时间戳 + token);
  • 操作回滚提示:拖拽后未保存前,页面顶部显示「已修改,点击保存生效」,避免误操作丢失;
  • 大列表优化:超过 100 条时禁用拖拽,改用「编辑排序值」数字输入框 + 实时保存;
  • 权限隔离:确保用户只能拖拽自己有权限管理的分类,后端必须再次鉴权,不可只信前端传来的 ID 列表。

不复杂但容易忽略。重点是选对数据模型,前后端约定好扁平结构格式,再把更新逻辑封装成可测试的 Service 方法。上线前务必用多层嵌套(5级+)、跨父级拖拽、首尾互换等场景压测。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

11764

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

6761

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2195

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

4288

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

5014

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3931

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5677

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4442

2023.11.13

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 218人学习

PHP自制框架
PHP自制框架

共8课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn