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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 11:15:03