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

Laravel中withCount()不随when()条件过滤更新的问题

Laravel withCount 关联统计不随条件过滤更新的解决方法

你当前的问题出在:when()里的whereRelation只是用来筛选存在符合条件交易的用户,但withCount('transactions')默认统计的是该用户的全部交易数量,并没有同步应用过滤条件,所以不管怎么筛选用户,统计数始终是总交易数。

下面是两种解决思路:

方法一:给withCount添加对应过滤条件

直接把date和location的过滤逻辑同步到withCount的闭包中,让统计只计算符合条件的交易:

public function allUsers(Request $request)
{
    $date = $request->input('date');
    $location = $request->input('location');

    $users = User::when(!empty($date), function ($query) use ($date) {
        return $query->whereRelation('transactions', 'date', '=', date('Y-m-d', strtotime($date)));
    })->when($location, function ($query) use ($location) {
        return $query->whereRelation('transactions', 'location', '=', $location);
    })->withCount(['transactions' => function ($query) use ($date, $location) {
        if (!empty($date)) {
            $query->where('date', '=', date('Y-m-d', strtotime($date)));
        }
        if ($location) {
            $query->where('location', '=', $location);
        }
    }])->get();

    return response()->json($users);
}

方法二:复用过滤闭包(更简洁)

把交易过滤逻辑封装成一个闭包,同时用在whereRelation和withCount里,避免重复代码:

public function allUsers(Request $request)
{
    $date = $request->input('date');
    $location = $request->input('location');

    // 封装交易过滤逻辑
    $transactionFilter = function ($query) use ($date, $location) {
        if (!empty($date)) {
            $query->where('date', '=', date('Y-m-d', strtotime($date)));
        }
        if ($location) {
            $query->where('location', '=', $location);
        }
    };

    $users = User::whereRelation('transactions', $transactionFilter)
        ->withCount(['transactions' => $transactionFilter])
        ->get();

    return response()->json($users);
}

额外说明

如果你想保留所有用户(包括没有符合条件交易的用户,此时统计数为0),只需要去掉whereRelation的过滤逻辑,只保留withCount里的条件即可:

$users = User::withCount(['transactions' => $transactionFilter])->get();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:37:37