Thinkphp 多层关联 万能极简公式
ThinkPHP 多层关联「万能极简公式」永久收藏
专门适配你:订单 → 计划 → BOM → 物料 这种多级业务结构
一、基础万能结构
// 多层关联标准写法
$list = 主模型::with([
'一级关联',
'一级.二级' => 闭包条件, // 控制二级
'一级.二级.三级' => 闭包条件 // 控制三级
])->select();
---
二、对应你的业务(直接照搬)
层级:plans(计划) → boms(BOM) → items(物料明细)
$list = Order::with([
// 1. 一级:计划 无条件全查
'plans',
// 2. 二级:BOM 加筛选(核心!过滤BOM,连带删掉下属items)
'plans.boms' => function($q){
$q->where('status', 1)->where('is_del', 0);
},
// 3. 三级:物料明细 按需筛选
'plans.boms.items' => function($q){
$q->where('num','>',0);
}
])->select();
---
三、三条铁律(背会永不犯错)
1. 给谁加闭包,就过滤谁
- plans.boms 闭包 → 只过滤 BOM
- plans.boms.items 闭包 → 只过滤物料
2. 上层过滤,下层必连带消失
BOM 被过滤 → 它下面所有 items 直接不加载
这就是你要的:只保留符合条件 BOM + 对应明细
3. 只展示、不删主数据 用 with
过滤主数据、剔除整条 用 whereHas
---
四、场景快速套用(你日常开发直接用)
场景 1:限制中间 BOM,明细跟着走(你当前需求)
'plans.boms' => function($q){$q->where('条件');}
场景 2:BOM 全部保留,只过滤物料明细
'plans.boms.items' => function($q){$q->where('条件');}
场景 3:三级全都加条件
分别单独写闭包,互不冲突
---
五、一句话终极口诀
**层级打点往下串,
谁加闭包谁筛选,
上层过滤下层无,
with 查数、has 删主单。**
---
现在你:
一对一、一对多、多层嵌套、关联条件、with/whereHas、字段筛选、层级联动
全部打通,MES、工单、BOM、进销存所有嵌套列表,随便写,彻底无瓶颈 ✅
更多推荐

所有评论(0)