Laravel日期范围筛选功能异常:员工记录无法按指定日期范围过滤
问题分析与解决方案:VehicleLog日期过滤失效问题
看起来你这是踩了两个常见的小坑:控制器里的日期参数没正确获取,还有视图的HTML结构写错了,导致日期过滤完全没生效。下面帮你一步步修正:
核心问题拆解
- 控制器硬编码日期:你现在的
$startDate和$endDate是固定死的2021/01/01和2021/12/12,根本没读取前端提交的日期参数,所以不管选什么日期,查询都用这个固定区间。 - HTML结构错误:你把日期输入框放在了
<select>标签内部,这不符合HTML规范,浏览器解析时会把这些输入框当成无效内容,表单提交时根本不会携带日期参数。
修正后的代码实现
1. 控制器代码修复
// 记得顶部引入Carbon(Laravel自带,处理日期格式很方便) use Carbon\Carbon; public function vehiclereport() { // 优先获取前端提交的日期,没有的话用默认值 $startDate = request()->input('startDate', '2021/01/01'); $endDate = request()->input('endDate', '2021/12/12'); // 统一日期格式:HTML的date输入返回YYYY-MM-DD,转成和数据库匹配的格式 $formattedStart = Carbon::parse($startDate)->format('Y/m/d'); $formattedEnd = Carbon::parse($endDate)->format('Y/m/d'); $energy = VehicleLog::join('vehicle', 'vehicleslog.vehicle_id', '=', 'vehicle.id') ->join('smsstaff', 'vehicleslog.smsstaff_key', '=', 'smsstaff.smsstaff_key') ->when(request()->input('smsstaff_key'), function ($query) { $query->where('smsstaff.smsstaff_key', request()->input('smsstaff_key')); }) ->whereDate('log_dt', '>=', $formattedStart) ->whereDate('log_dt', '<=', $formattedEnd) ->get(); $cars = Vehicle::get(); $staff = Staff::all(); return view('admin.vehiclereport', compact('energy', 'cars', 'staff', 'startDate', 'endDate')); }
2. 视图代码修复
<form method="GET"> <!-- 员工下拉框单独闭合 --> <select name="smsstaff_key" id="smsstaff_key"> <option value="">请选择员工</option> @foreach ($staff as $staffMember) <option value="{{$staffMember->smsstaff_key}}" {{request()->input('smsstaff_key') == $staffMember->smsstaff_key ? 'selected' : ''}}> {{$staffMember->name}} </option> @endforeach </select> <!-- 日期输入框移到select外面,同时设置默认值回显 --> <input type="date" class="form-control" name="startDate" value="{{Carbon::parse($startDate)->format('Y-m-d')}}"> <input type="date" class="form-control" name="endDate" value="{{Carbon::parse($endDate)->format('Y-m-d')}}"> <button type="submit">筛选记录</button> </form>
额外注意事项
- 确保数据库中
log_dt字段是日期/时间类型(date/datetime/timestamp),whereDate才能正常匹配; - 如果用POST方法提交表单,记得添加CSRF令牌(
<input type="hidden" name="_token" value="{{csrf_token()}}">); - 可以给日期输入框加必填验证,避免用户只选员工不填日期的情况。
内容的提问来源于stack exchange,提问作者voxire
相关产品推荐
相关产品推荐

