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
相关产品推荐
相关产品推荐

