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

Laravel中如何通过单次查询从hasMany关系的pivot表获取quantity总和

最优实现方案(规避N+1查询,全程仅执行1-2次SQL)

方案1:使用Laravel 8+ 原生withSum方法(推荐)

  1. 首先给CattleType模型定义和中间表的关联,在app/Models/CattleType.php中新增代码:
/**
 * 关联属性-牛只类型中间表
 */
public function propertiesCattleTypes()
{
    return $this->hasMany(PropertiesCattleType::class, 'cattle_type_id');
}
  1. 直接在查询关联时追加聚合统计,一行代码完成需求:
$cattleTypesForCurrentUser = Auth::user()->cattleTypes()
    ->withSum('propertiesCattleTypes', 'quantity')
    ->get();

// 可选:把默认生成的统计字段重命名为你需要的quantity
$cattleTypesForCurrentUser->map(function ($item) {
    $item->quantity = $item->properties_cattle_types_sum_quantity ?? 0;
    unset($item->properties_cattle_types_sum_quantity);
    return $item;
});

方案2:使用join联表统计(兼容低版本Laravel)

如果你的Laravel版本低于8.0不支持withSum,可以直接用联表分组统计,性能同样优秀:

$cattleTypesForCurrentUser = Auth::user()->cattleTypes()
    ->selectRaw('cattle_types.*, COALESCE(SUM(properties_cattle_types.quantity), 0) as quantity')
    ->leftJoin('properties_cattle_types', 'cattle_types.id', '=', 'properties_cattle_types.cattle_type_id')
    ->groupBy('cattle_types.id')
    ->get();

两种方案都完全避免了循环查询数据库的问题,数据量越大性能优势越明显,返回的结果字段完全符合你要求的格式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:45:05