Laravel Eloquent whereHas关联查询日期筛选失效问题求助
问题分析与解决方案
你的问题出在**whereHas的作用只是筛选出存在符合条件关联记录的主模型(Client),但并不会过滤最终返回的关联数据(ClientMaintenance)**。也就是说,只要某个Client有至少一条满足日期条件的维护记录,它就会被选中,并且该Client的所有维护记录都会被加载出来,不管日期是否符合。
修复后的代码
$date_from = '2018-01-01'; $client = $request->get('client'); $clients = Client::where('id', '=', $client) // 筛选存在符合日期条件维护记录的Client ->whereHas('client_maintenance', function($query) use ($date_from) { $query->whereDate('date', '>=', $date_from); }) // 预加载并过滤关联的维护记录,只保留符合日期条件的 ->with(['client_maintenance' => function($query) use ($date_from) { $query->whereDate('date', '>=', $date_from); }]) ->get();
为什么这样有效?
whereHas:负责过滤主模型,确保只返回那些存在至少一条符合日期条件维护记录的Client。with:负责预加载关联数据时,只加载符合日期条件的ClientMaintenance记录,而不是该Client的所有维护记录。
你之前的代码只使用了whereHas,所以虽然筛选出了符合条件的Client,但关联数据还是完整加载了所有记录。通过同时添加with的闭包过滤,就能得到你想要的结果——既只保留有符合日期维护记录的Client,同时这些Client的维护记录也只显示符合日期的条目。
比如对于client_id=4的情况,修改后的代码会返回该Client,并且只包含2018-01-09这条维护记录,而2017-12-23的记录会被过滤掉。
内容的提问来源于stack exchange,提问作者CIB
相关产品推荐
相关产品推荐

