Laravel Eloquent如何仅获取withCount生成的关联统计属性
问题描述
我遇到了需要仅返回withCount属性的场景,示例代码如下:
$data = SystemReport::withCount(['unit' => function($query) { $query->where('totalPercentage', '=', 100); }])->get() ->groupBy(function($val) { return Carbon::parse($val->updated_at)->format('M'); });
上述代码返回的结果结构如下:
{ "id": 1, "unit_id": 1, "human_resource_id": null, "quality_id": null, "construction_id": 1, "digital_transformation_id": 1, "confirmationDate": "2024-11-10", "expectedDate": "2024-11-20", "totalPercentage": 90, "created_at": "2021-05-29T11:44:25.000000Z", "updated_at": "2021-05-29T16:22:10.000000Z", "unit_count": 0 }
我仅需要返回由withCount新增的unit_count属性。
注意:我不希望在获取查询结果后通过映射遍历处理,希望能直接在Laravel Eloquent层面实现该需求,请问有什么可行的解决方案?
解决方案
你可以通过Eloquent的select()方法显式指定需要查询的字段,在SQL层面完成字段过滤,无需获取结果后二次处理:
- withCount生成的
unit_count统计字段会自动追加到查询选择列表中,不需要手动声明 - 仅需要将业务逻辑依赖的其他字段(比如本次分组用到的
updated_at)加入选择列表即可,原表其余字段不会被返回
修改后代码如下:
$data = SystemReport::withCount(['unit' => function($query) { $query->where('totalPercentage', '=', 100); }]) ->select('updated_at') // 仅保留分组需要的字段 ->get() ->groupBy(function($val) { return Carbon::parse($val->updated_at)->format('M'); });
如果你需要直接在SQL层面完成按月分组,进一步减少数据传输和后续处理,还可以使用selectRaw直接做聚合,返回结果完全没有冗余字段:
$data = SystemReport::withCount(['unit' => function($query) { $query->where('totalPercentage', '=', 100); }]) ->selectRaw('DATE_FORMAT(updated_at, "%b") as month, SUM(unit_count) as total_unit_count') ->groupBy('month') ->get();
内容的提问来源于stack exchange,提问作者omar esmaeel
相关产品推荐
相关产品推荐

