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

Laravel中数据库日期存为字符串的查询报错问题排查

问题解决:Laravel中按字符串格式日期过滤数据报错

原代码存在的问题

  • 调用get()后未将查询结果赋值,直接返回的是查询构建器实例而非实际数据
  • Carbon::parse($request->att_date)返回的是DateTime对象,和数据库STR_TO_DATE转换后的日期格式不匹配,数据库需要字符串格式的日期
  • 未处理$site_details为null的情况,找不到对应站点时会直接报错
  • 方法最后返回的是未执行完成的查询构建器,不是查询结果

修正后的代码

// 搜索考勤记录
public function searchAttendance(Request $request)
{
    // 先处理站点查询,避免null报错
    $site_details = tbl_site::where("site_name", $request->site_name)->first();
    if (!$site_details) {
        return collect(); // 返回空集合或自定义错误响应
    }

    // 转换请求日期为数据库匹配的字符串格式
    $formattedDate = Carbon::parse($request->att_date)->format('Y-m-d');

    // 执行查询并获取结果
    $attendanceRecords = tbl_master_attendance::where("attendance_site_id", $site_details->site_id)
        ->whereRaw("STR_TO_DATE(attendance_date,'%d-%m-%Y') = ?", [$formattedDate])
        ->get();

    return $attendanceRecords;
}

关键优化点

  • 使用whereRaw替代DB::Raw配合普通where,更安全且符合Laravel最佳实践,避免SQL注入风险
  • 将Carbon解析后的日期转为Y-m-d字符串,和数据库STR_TO_DATE转换后的日期格式一致
  • 增加$site_details的空值判断,防止因找不到站点导致的致命错误
  • 直接返回查询结果集合,而非查询构建器实例

内容的提问来源于stack exchange,提问作者swapnil mane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:05:29