Laravel使用hasManyDeep跨级关联后withSum统计所有仓库值相同问题
问题原因
你当前的统计结果异常是因为hasManyDeep的默认关联逻辑不符合业务场景:
原关联路径是「仓库→中间表→商品→销售记录」,这种写法会把所有和当前仓库关联的商品的全部销售记录都纳入统计,不管这些销售记录实际归属哪个仓库。比如同一个商品同时在多个仓库售卖,该商品的所有销售记录会被重复计入所有关联了该商品的仓库的销售总额,自然会出现多个仓库sum值相同的问题。
解决方案
方案1:直接关联(最优推荐)
你提供的sales表本身已经存储了warehouse_id字段,完全不需要引入第三方扩展包做深层关联,直接在Warehouse模型中定义一对多关联即可:
// warehouse.php public function sales () { return $this->hasMany(Sale::class); }
原有Controller的withSum代码不需要做任何修改,即可得到正确的统计结果。
方案2:调整深层关联逻辑(仅适用于必须走商品关联路径的特殊场景)
如果你有特殊业务要求必须通过「仓库-商品」的关联路径查询销售记录,给hasManyDeep关联加上仓库归属的字段约束即可:
// warehouse.php public function sales () { return $this->hasManyDeep(Sale::class, ['product_warehouse', Product::class]) ->whereColumn('sales.warehouse_id', 'warehouses.id'); }
这个约束会保证只统计归属当前仓库的销售记录,避免跨仓库统计的问题。
内容的提问来源于stack exchange,提问作者Othmane
相关产品推荐
相关产品推荐

