You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Eloquent hasManyThrough关联withCount返回无采购供应商问题

问题原因

  1. 无采购记录的供应商出现在结果中,是因为withCount本身仅负责为父模型追加关联统计字段,不会自动过滤无关联的父记录,无对应采购明细的供应商qty_sold会被赋值为NULL,因此会保留在查询结果中。
  2. 你之前写的whereHas方案拿不到qty_sold,是因为你把withCount写在了purchases关联的查询闭包内,统计值是挂载在查询到的Purchase模型上的,父模型Supplier无法获取到该字段。

解决方法

同时使用withCount做统计、whereHas做关联存在性过滤,两者的查询条件保持一致即可:

$unit = 'kg';
$collectors = Supplier::withCount(['detail_purchases as qty_sold' => function($query) use ($unit) {
    return $query->select(\DB::raw('SUM(qty)'))
        ->where('unit', '=', $unit);
}])
// 筛选存在符合条件的采购明细的供应商
->whereHas('detail_purchases', function($query) use ($unit) {
    $query->where('unit', '=', $unit);
})
->where('supplier_type','=','persona_natural')
->orderBy('qty_sold','desc')
->get();

该写法生成的SQL会自动添加关联存在校验,仅返回有单位为kg的采购明细的供应商,同时每个供应商模型都会挂载正确的qty_sold采购总重量统计值。

内容的提问来源于stack exchange,提问作者FreddicMatters

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:24:04