tree()
tree(?int $parentId = null) : array
地区树(按需加载):缺省只查顶级(省);传 parentId 查该节点子级。 66 万条五级数据不能全量组树(内存/递归爆),必须懒加载。 按 parentId 缓存(顶级 parentId=0),地区变更(region:restore/CRUD)自动失效。
Parameters
| ?int | $parentId |
地区服务
职责:省/市/区/街道/村五级树(ancestors 祖级路径 0/1/5/);level 按父级自动推导, 调整父级时级联重算全部后代的 ancestors 与 level;金字塔级联启用/停用在此收口。
┌────────────────── 分区导航(按此顺序阅读)──────────────────┐ 分区 1 · 查询(读) tree / stats / cascader / path / search 分区 2 · 写操作 create / update / destroy / updateStatus 分区 3 · 内部辅助 pathOf / resolvePlacement / cascade └────────────────────────────────────────────────────────────┘
search(string $keyword, ?int $limit = null) : array
地区搜索(任意层级,服务端):供管理页搜索框定位任意层级地区。
66 万行无 name/pinyin 索引,名称/拼音为子串匹配(seq scan),LIMIT 兜底—— 实测「%海%」取 50 行 ≈ 100ms,管理后台低频可接受; pinyin 存储带空格("bao hua"),匹配前双方去空格;code 为 12 位数字,走前缀匹配。 比较统一 LOWER() 大小写不敏感(pg LIKE 区分大小写);标准 SQL,测试 sqlite 亦可跑。 每行带 path(省→…→自身)供前端定位层级。
| string | $keyword | |
| ?int | $limit |
cascade(\App\Models\SysRegion $region, string $newAncestors, int $newLevel, int $newParentId) : void
级联重算后代:ancestors 旧前缀替换为新前缀,level 随自身层级差平移。 批量 UPDATE 单源:AncestorsPath::cascadeUpdate(前缀区间走 idx_region_ancestors)。
| \App\Models\SysRegion | $region | |
| string | $newAncestors | |
| int | $newLevel | |
| int | $newParentId |