0

0

Laravel怎么实现无限级分类 _ Laravel 递归模型查询方法【教程】

冰火之心

冰火之心

发布时间:2026-02-23 14:43:17

|

588人浏览过

|

来源于php中文网

原创

用hasmany+belongsto即可实现无限级分类,关键在合理设计parent_id字段、控制查询层级而非盲目递归,90%场景只需预加载2层;扁平化数据+前端建树比嵌套json更稳定高效。

laravel怎么实现无限级分类 _ laravel 递归模型查询方法【教程】

hasMany + belongsTo 搭建父子关系就足够了

无限级分类在 Laravel 里不需要额外包或复杂递归查询——只要数据库字段设计合理(比如 parent_id),模型间用标准关联就能支撑任意深度。关键不是“怎么递归”,而是“什么时候该查子树、什么时候只查一层”。

常见错误是刚建好 Category 模型就急着写 with('children'),结果 N+1 或爆内存。其实 Laravel 默认不递归加载,with() 只做一层预加载,想查整棵树得手动控制层级。

  • parent_id 字段必须允许为 NULL(根节点)且加索引
  • 模型中定义 children 关联时,要用 hasMeny(..., 'parent_id'),别错写成 foreignKey 参数位置不对
  • 避免在 Blade 中循环调用 $category->children——这会触发懒加载,每层都发新 SQL

查整棵树用 whereDescendantOf()?先装 kalnoy/nestedset

不用。如果你只是偶尔需要获取某个节点的全部后代(比如后台导出分类树),原生 Eloquent 加简单递归函数就够了;但若高频读取、还要拖拽排序、移动子树,那才值得引入 kalnoy/nestedset。它改用左右值模型,读快写慢,且和 Laravel 的软删除、作用域等机制有兼容风险。

真实场景中,90% 的“无限级”需求其实只需要展开 3 层以内(如:频道 → 分类 → 子类),这时候用「预加载 + 控制深度」比换方案更稳。

  • with(['children' => fn ($q) => $q->with('children')]) 最多预加载两层,第三层起不查
  • kalnoy/nestedset 要求表结构变更(_lft/_rgt 字段),迁移成本高,测试覆盖不到位容易数据错乱
  • 它的 getDescendants() 返回的是集合,不是查询构造器,无法链式添加 where() 条件

scopeWithTree() 这种全局作用域真能复用吗

能,但容易误用。自定义作用域适合封装固定逻辑,比如“只取启用状态的完整分类树”,但它不能动态控制递归深度,也不能按需加载关联字段(比如有时要带 products_count,有时不要)。

EasySite
EasySite

零代码AI网站开发工具

下载

更灵活的做法是把树形数据组装逻辑抽到服务类或资源类里,而不是堆在模型上。模型只管单层关系,组装交给上层。

  • 作用域里写递归调用 $this->children() 会导致死循环(Eloquent 会尝试加载自身)
  • 如果 scope 内用了 with(),调用方再写 with() 会被覆盖,不是合并
  • 测试时难 mock,尤其涉及多层嵌套后,断言容易变成“验证数组嵌套层数是否等于 4”这种脆弱逻辑

前端渲染树时,后端该返回扁平数组还是嵌套数组

返回扁平数组(带 idparent_iddepth)更可控。Laravel 的 Collection::nest() 方法不稳定(5.x 已移除,8+ 不再内置),自己写递归组装嵌套结构容易栈溢出或漏节点;而前端用 Map 一次遍历就能建树,还能自由控制是否折叠、是否显示计数。

后端强行返回嵌套结构,反而增加 JSON 序列化开销,且一旦字段名变化(比如把 name 改成 title),前后端都要改。

  • 数据库查出所有相关节点后,用 collect($rows)->groupBy('parent_id') + 简单 while 循环即可生成带层级的扁平列表
  • 避免用 json_encode($collection->toTree()) —— toTree() 是第三方扩展方法,非 Laravel 原生,项目升级可能失效
  • 如果接口要支持分页,嵌套结构根本没法分页;扁平结构可配合 limit + 前端虚拟滚动

真正麻烦的从来不是“怎么写出无限级”,而是“怎么让第 5 层的子分类在搜索、筛选、权限校验时不拖慢整个请求”。树形结构越深,越要警惕查询范围失控——比如一个 whereHas('children.children.children') 看似无害,实际可能扫全表。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

335

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

288

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

642

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

131

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

81

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

69

2025.08.05

数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1026

2023.10.12

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1030

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号