Laravel日期查询需求:无请求日期时返回当日数据
修复Laravel日期查询逻辑问题
原代码的问题在于orWhere会破坏查询逻辑,实际生成的SQL会变成(vehicle_id = ? AND date = ?) OR date = ?,导致vehicle_id的过滤条件被部分忽略,不符合需求。以下是正确的实现方式:
方案一:条件判断拼接查询
// 先固定车辆ID的过滤条件 $query = VehicleTask::where('vehicle_id', $this->driver); // 根据请求参数动态添加日期条件 if ($request->has('date')) { $query->whereDate('date', $request->date); } else { $query->whereDate('date', Carbon::today()->toDateString()); } $tasks = $query->get();
方案二:使用when方法简化代码
Laravel的when方法可以更简洁地实现条件式逻辑拼接:
$tasks = VehicleTask::where('vehicle_id', $this->driver) ->when($request->date, function ($query, $date) { return $query->whereDate('date', $date); }, function ($query) { return $query->whereDate('date', Carbon::today()->toDateString()); }) ->get();
补充说明
Carbon::today()->toDateString()等价于Carbon::now()->format('Y-m-d'),写法更简洁规范- 如果前端传入的
date格式不是Y-m-d,需要先做格式转换,比如Carbon::parse($request->date)->toDateString() - 两种方案都能保证
vehicle_id的过滤条件始终生效,最终生成的SQL为vehicle_id = ? AND date = ?,完全符合需求
内容的提问来源于stack exchange,提问作者Malik Zubair Mukhtar
相关产品推荐
相关产品推荐

