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
相关产品推荐
相关产品推荐

