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

Laravel11.x无限级分类怎么生成分类路径path字段

云伟君_1129

云伟君_1129

发布时间:2026-10-28 13:26:29

|

819人浏览过

|

来源于php中文网

原创

推荐使用路径枚举法实现无限级分类并自动生成path字段,通过在Category模型中用观察者自动维护path(根节点为'0',子节点拼接父path),支持高效祖先查询与移动节点递归更新。

laravel11.x无限级分类怎么生成分类路径path字段

在 Laravel 11.x 中实现无限级分类并自动生成 path 字段(如 0-1-5-12),推荐使用「闭包表(Closure Table)」或「路径枚举(Path Enumeration)」两种主流方案。其中,路径枚举法更轻量、查询快、适合中小规模分类树,且能天然支持 path 字段的生成与维护。

一、数据库设计:添加 parent_id 和 path 字段

假设分类表为 categories:

  • id:主键
  • name:分类名称
  • parent_id:父级 ID(根节点为 null 或 0,建议用 null)
  • path:字符串类型(如 VARCHAR(255)),存储以短横线分隔的祖先 ID 链,例如 "0-1-5" 表示:根 → 一级分类1 → 二级分类5

⚠️ 注意:path 中的首段建议统一用 0 表示虚拟根,便于后续查询所有分类(如 WHERE path LIKE '0-%')和避免空值处理问题。

二、模型中自动维护 path 字段(推荐用观察者)

创建 Category 模型,并绑定 creating 和 updating 观察者逻辑:

  • 新增时:若为根节点(parent_id === null),path = '0';否则查出父级 path,拼接自身 ID(如 $parent->path . '-' . $this->id)
  • 移动节点时(修改 parent_id):需递归更新当前节点及其全部子树的 path(可用事务 + 递归查询 + 批量更新)

示例(在 app/Observers/CategoryObserver.php 中):

laravel-specialist
laravel-specialist

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

下载
public function creating(Category $category)
{
    if ($category->parent_id === null) {
        $category->path = '0';
    } else {
        $parent = Category::find($category->parent_id);
        $category->path = $parent ? $parent->path . '-' . $category->id : '0';
    }
}
<p>public function updating(Category $category)
{
// 检测 parent_id 是否变更
if ($category->isDirty('parent_id')) {
$oldParentId = $category->getOriginal('parent_id');
$newParentId = $category->parent_id;</p><pre class="brush:php;toolbar:false;">    // 获取新父节点 path
    $newParent = $newParentId ? Category::find($newParentId) : null;
    $newPathPrefix = $newParent ? $newParent->path : '0';

    // 更新当前节点及所有后代的 path
    $this->updateDescendantPaths($category, $newPathPrefix);
}

}

protected function updateDescendantPaths(Category $node, string $newPathPrefix) { $children = Category::where('path', 'like', $node->path . '-%')->get(); foreach ($children as $child) { $child->path = $newPathPrefix . substr($child->path, strlen($node->path)); $child->save(); } // 当前节点也要更新 $node->path = $newPathPrefix . '-' . $node->id; }

? 提示:生产环境建议将递归更新改为队列任务或使用闭包表替代,避免深度嵌套导致性能下降。

三、快速查询某分类的所有祖先(含自身)

利用 path 字段可高效反向解析:

// 获取 ID=12 的分类及其所有祖先(按层级从高到低)
$ids = explode('-', Category::find(12)->path); // ['0','1','5','12']
$ancestors = Category::whereIn('id', $ids)->orderByRaw("FIELD(id, " . implode(',', $ids) . ")")->get();

或者直接用 SQL 查询(Laravel 11 支持原生表达式):

Category::whereRaw("FIND_IN_SET(id, REPLACE(?, '-', ','))", [$category->path])
    ->orderByRaw("LENGTH(path) - LENGTH(REPLACE(path, '-', ''))")
    ->get();

四、补充建议:避免 path 冗余更新 & 支持软删除

  • 在 deleting 观察者中,不直接删子类,而是先清空其 parent_id 或标记迁移,防止 path 断链
  • 对高频变动的分类树,可增加缓存(如 Redis 存储 id => path 映射),减少数据库查询
  • 考虑使用 laravel-nestedset 包(基于左右值),它内置完整 path / depth / children 管理,但学习成本略高

不复杂但容易忽略:每次写入前校验 parent_id 是否真实存在,避免生成错误 path;同时确保 path 字段有索引(如前缀索引 INDEX(path(100)))以提升模糊查询效率。

热门AI工具

更多
豆包大模型

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

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

WorkBuddy

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

DeepSeek

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

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

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

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

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

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

11624

2023.09.01

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

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

6701

2023.10.11

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

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

2175

2023.10.11

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

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

4248

2023.10.23

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

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

4954

2023.10.23

html怎么上传
html怎么上传

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

3891

2023.11.03

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

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

5617

2023.11.09

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

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

4402

2023.11.13

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

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

0

2026.10.28

热门下载

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

精品课程

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

共1课时 | 213人学习

PHP自制框架
PHP自制框架

共8课时 | 0.8万人学习

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

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