tp6.0模型获取器可统一处理树形结构字段,通过getlabelattr、getvalueattr等定义label/value/disabled等契约字段,并用append+getchildrenattr动态注入children,配合visible/hidden精准控制输出,实现前端tree组件开箱即用。

TP6.0 的模型获取器不是只用来转状态文字的,它还能提前把树形结构需要的字段“准备好”,让前端 Vue 或 React 的 Tree 组件(比如 Element Plus 的 el-tree 或 Ant Design 的 Tree)直接消费,省去前端反复映射、拼接、递归转换的麻烦。
用获取器统一处理树节点显示字段
树形控件通常要求数据有 label、value、children 这类固定字段,但数据库表里可能是 name、id、pid。与其在控制器里手动 foreach 改键名,不如在模型里用获取器定义好:
- 在模型中添加
getLabelAttr:返回$this->name或带前缀/后缀的格式化名称 - 添加
getValueAttr:直接返回$this->id,确保和后端逻辑一致 - 添加
getDisabledAttr:根据status字段返回布尔值,控制节点是否可选
这样查出来的每个模型实例,天然就带 label、value、disabled 属性,前端可直接绑定,不用再写一层 map 转换。
用 append 动态注入 children 关系
TP6 默认查出的是扁平数组(如所有菜单项),但树组件需要嵌套结构。你不需要在 PHP 层做递归组装——那是后端过度干预前端渲染逻辑。更轻量的做法是:
- 先用
withAttr或获取器把单条记录的展示字段准备好 - 然后用
append(['children'])告诉模型:“这个字段不存库,但我需要它” - 在模型里定义
getChildrenAttr方法,内部调用self::where('pid', $this->id)->select(),自动挂载子节点
注意:这种方式适合层级浅、数据量不大的菜单或分类场景;若数据量大,建议后端直接返回已组装好的树形 JSON,避免 N+1 查询。
配合 visible / hidden 控制输出字段
前端树组件往往只需要几个字段,多余字段(比如 create_time、remark)传过去纯属浪费带宽。TP6 的 visible 和 hidden 方法能精准控制:
-
$menu->visible(['label', 'value', 'disabled', 'children'])->toArray()—— 只暴露树所需字段 -
$menu->hidden(['password', 'token', 'update_time'])->toArray()—— 隐私或冗余字段一键过滤
尤其在返回整个菜单树时(Menu::tree()->toArray()),配合获取器 + visible,输出的就是一份开箱即用的前端树数据,结构干净、语义清晰、无冗余。
前后端约定好字段,避免运行时判断
很多项目前端要写一堆 node.label || node.name || node.title 这样的兼容逻辑。根源是后端没统一字段出口。TP6 获取器可以成为这个“约定枢纽”:
- 所有树节点统一走
label显示名、value唯一标识、isLeaf是否叶子节点(由getIsLeafAttr根据是否有子数据返回) - 前端不再关心原始字段名,只认这几个“契约字段”
- 后续加图标、扩展属性(如
icon、href),也只在模型获取器里补,前端零改动
这种设计让前后端边界更清晰,也方便未来切换不同 UI 库(从 Element 切到 Arco、Naive),只要数据结构不变,树组件就能复用。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











