Laravel查询Vehicle模型时,如何筛选指定日期范围的关联fuel_entries
Laravel关联模型日期范围过滤实现
要实现查询Vehicle模型时,仅获取指定日期范围内的fuel_entries关联数据,同时按需筛选车辆,可以按以下方式操作:
方法一:仅保留有符合条件关联数据的车辆
如果需要只返回存在指定日期范围内fuel_entries的车辆,且关联数据仅包含该时间段的记录,用with()闭包过滤关联数据,搭配whereHas()筛选车辆:
// 定义目标日期范围 $startDate = '2024-01-01'; $endDate = '2024-06-30'; $vehicles = Vehicle::with(['fuels' => function ($query) use ($startDate, $endDate) { // 替换date_column为fuel_entries表中存储日期的字段(比如created_at、entry_date) $query->whereBetween('date_column', [$startDate, $endDate]); }])->whereHas('fuels', function ($query) use ($startDate, $endDate) { // 和上面的条件保持一致,确保车辆存在符合日期范围的fuel_entries $query->whereBetween('date_column', [$startDate, $endDate]); })->get();
方法二:保留所有车辆,仅返回符合条件的关联记录
如果需要获取全部车辆,但仅展示指定日期范围内的fuel_entries(无符合条件记录的车辆,其fuels关联数组为空),只需保留with()的闭包过滤逻辑:
$startDate = '2024-01-01'; $endDate = '2024-06-30'; $vehicles = Vehicle::with(['fuels' => function ($query) use ($startDate, $endDate) { $query->whereBetween('date_column', [$startDate, $endDate]); }])->get();
补充:日期条件的其他写法
如果日期字段是created_at,也可以用区间比较替代whereBetween:
$query->where('created_at', '>=', $startDate) ->where('created_at', '<=', $endDate);
内容的提问来源于stack exchange,提问作者Shah Foyez
相关产品推荐
相关产品推荐

