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、进销存所有嵌套列表,随便写,彻底无瓶颈 ✅

 

更多推荐