You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel日期范围筛选功能异常:员工记录无法按指定日期范围过滤

问题分析与解决方案:VehicleLog日期过滤失效问题

看起来你这是踩了两个常见的小坑:控制器里的日期参数没正确获取,还有视图的HTML结构写错了,导致日期过滤完全没生效。下面帮你一步步修正:

核心问题拆解

  1. 控制器硬编码日期:你现在的$startDate和$endDate是固定死的2021/01/01和2021/12/12,根本没读取前端提交的日期参数,所以不管选什么日期,查询都用这个固定区间。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 20:49:06