本文详解如何在 laravel 的单一 `category` 模型中,基于 `category_type` 和 `parent_category` 字段,灵活定义并查询不同层级的自关联一对多关系(如主类目→上级类目、上级类目→次级类目等)。
在单表多类型分类场景中(如 categories 表通过 category_type 区分“主类目”“上级类目”“次级类目”等),虽然物理上只有一张表和一个 Eloquent 模型,但逻辑上存在清晰的层
级依赖关系。此时无需拆分模型,而是通过自关联关系(Self-Referencing Relationships) + 条件约束(Query Scopes 或带 where 的关系方法) 实现语义化、可复用的关联定义。
首先,在 app/Models/Category.php 中补充以下关系方法:
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
use HasFactory;
protected $fillable = [
'name', 'short_name', 'description', 'picture',
'category_type', 'parent_category'
];
// 【核心】反向关系:当前分类所属的父分类(一对一)
public function parentCategory()
{
return $this->belongsTo(Category::class, 'parent_category', 'id');
}
// 【核心】正向关系:当前分类下的所有子分类(一对多)
public function childCategories()
{
return $this->hasMany(Category::class, 'parent_category', 'id');
}
// 【按类型细化】获取指定类型的子分类(例如:主类目 → 上级类目)
public function superiorChildCategories()
{
return $this->childCategories()->where('category_type', 2); // 2 = Superior Category
}
// 同理可扩展其他类型关系
public function secondaryChildCategories()
{
return $this->childCategories()->where('category_type', 3); // 3 = Secondary Category
}
public function mainParentCategory()
{
return $this->parentCategory()->where('category_type', 1); // 只关联到主类目
}
}✅ 使用示例:
// 获取首个主类目(category_type = 1)
$main = Category::where('category_type', 1)->first();
// 获取它所有的「上级类目」子项(category_type = 2)
$superiors = $main->superiorChildCategories; // 自动应用 where('category_type', 2)
// 获取某个次级类目的直接父类目(无论父类目类型)
$secondary = Category::where('category_type', 3)->first();
$parent = $secondary->parentCategory; // 返回 Category 实例(如为 Superior 类目)
// 链式查询:查找某主类目下所有「次级子类目」的「次级子子类目」
$grandChildren = $main
->secondaryChildCategories()
->with(['secondaryChildCategories']) // 预加载二级子项
->get();⚠️ 关键注意事项:
const TYPE_MAIN = 1; const TYPE_SUPERIOR = 2; const TYPE_SECONDARY = 3; const TYPE_SUB_SECONDARY = 4;
通过这种设计,你既能保持模型简洁性,又能精准表达业务中的多层分类语义,同时获得 Laravel ORM 全套查询能力(过滤、排序、预加载、分页等),是处理树形结构与类型化自关联的经典实践方案。
# php
# laravel
# go
# app
# 懒加载
# ai
# NULL
# 常量
# 字符串
# 访问器
# delete
# table
# database
# 数据库
# 性能优化
# 类目
# 加载
# 链式
# 的是
# 有一
# 才是
# 可在
# 分页
# 又能
# 而非
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11怎么设置任务栏大小_Windows11注册表修改TaskbarSi值
Windows10如何删除Windows.old_Win10磁盘清理系统文件选项
如何在Golang中处理数据库事务错误_回滚和日志记录
Windows10系统更新错误0x80070002_Win10自动更新失败手动修复
php转mp4怎么保留字幕_php处理带字幕视频转换说明【说明】
Windows 10怎么隐藏特定更新补丁_Windows 10使用微软官方工具wushowhide.diagcab
Win11怎么设置快速访问_Windows11文件资源管理器主页
Windows 11无法安全删除U盘提示设备正在使用中怎么办_Windows 11找出占用设备进程
Mac如何开启夜览模式_Mac护眼模式设置与定时
Python函数参数高级用法_默认值与可变参数解析【教程】
如何在Golang中使用container/heap实现堆_Golang container/heap最小堆方法
Python并发安全问题_资源竞争说明【指导】
Windows10电脑怎么设置文件权限_Win10安全选项卡所有者修改
Win11怎么关闭贴靠布局_Win11禁用窗口最大化时的布局菜单
Win11如何更改任务栏颜色 Win11自定义任务栏背景色【美化】
英国搜索:多数英国人认为语言搜索是未来搜索
Win11怎么关闭用户账户控制UAC_Windows11更改通知设置等级
Win11系统更新后黑屏怎么办 Win11更新黑屏修复教程【方法】
C++友元类使用场景_C++类间协作设计方式讲解
Win11怎么激活Windows10_Win11激活Win10系统方法【步骤】
Win10系统怎么查看网络连接状态_Windows10网络和共享中心
Win11怎么清理C盘下载文件夹_Win11清理下载文件夹技巧【教程】
Win11怎么设置开机自动连接宽带_Windows11创建拨号连接计划任务
c# 服务器GC和工作站GC的区别和设置
Win11怎么设置夜间模式_Windows11显示设置蓝光过滤强度
如何使用Golang defer优化性能_减少不必要的函数调用
Golang如何测试HTTP中间件_Golang HTTP中间件功能测试实践
Windows蓝屏错误0x00000018怎么处理_驱动初始化错误解决
Win11怎样安装搜狗输入法_Win11安装搜狗输入法教程【步骤】
Win10怎样卸载iTunes_Win10卸载iTunes步骤【步骤】
php订单日志怎么记录评价_php记录订单评价日志方法【方法】
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何在 Go 应用中实现自动错误恢复与进程重启机制
VSC怎样在Linux运行PHP_Ubuntu系统配置步骤【操作】
php订单日志怎么按金额排序_php按订单金额排序日志方法【方法】
Win10怎样卸载自带Edge_Win10卸载Edge浏览器步骤【教程】
Win11怎么查看局域网电脑_Windows 11网络邻居发现设置【技巧】
Windows10系统怎么查看显卡型号_Win10 dxdiag显示选项卡
Win11怎么压缩文件 Win11自带压缩解压功能使用【教程】
如何使用Golang实现Web表单数据绑定_自动映射字段到结构体
Python异步编程高级项目教程_asyncio协程任务管理实战
Windows10如何更改鼠标图标_Win10鼠标属性指针浏览
Win11怎么用设置清理回收站_Win11设置清理回收站技巧【步骤】
如何自定义Windows终端的默认配置文件?(PowerShell/CMD)
Django密码修改后会话失效的解决方案
Win11怎么设置系统还原_Windows11系统属性保护设置
Win11此电脑不在桌面上_Windows 11桌面图标设置找回【步骤】
C#如何使用Channel C#通道实现异步通信
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Win11怎么更改任务栏位置_修改注册表将Win11任务栏置顶【教程】
2026-01-05
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。