Laravel中如何通过单次查询从hasMany关系的pivot表获取quantity总和
最优实现方案(规避N+1查询,全程仅执行1-2次SQL)
方案1:使用Laravel 8+ 原生withSum方法(推荐)
- 首先给
CattleType模型定义和中间表的关联,在app/Models/CattleType.php中新增代码:
/** * 关联属性-牛只类型中间表 */ public function propertiesCattleTypes() { return $this->hasMany(PropertiesCattleType::class, 'cattle_type_id'); }
- 直接在查询关联时追加聚合统计,一行代码完成需求:
$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
相关产品推荐
相关产品推荐

