Laravel数据库migration中dateTime字段存入后显示0000-00-00问题
问题原因及解决方法
常见触发原因
- 输入日期格式不匹配:Laravel Migration中定义的
dateTime字段要求写入格式为Y-m-d H:i:s,如果前端提交的是d/m/Y H:i之类的非标准格式(即日/月/年格式),框架无法正常解析,就会传入空值给数据库,最终存储为0000-00-00 00:00:00。 - 模型批量赋值白名单未配置:如果你使用Eloquent模型进行数据写入,需要确认
appointment_date字段已经添加到模型的$fillable属性中,否则批量赋值时该字段会被直接过滤,没有传值的情况下就会写入数据库默认的零值。 - 数据库非严格模式掩盖错误:MySQL默认未开启严格模式时,写入无效的datetime值不会抛出报错,而是自动转换为零值存储,无法直接感知到格式错误问题。
对应解决方案
- 写入前转换日期格式,推荐使用Carbon处理用户输入:
use Carbon\Carbon; // 按前端实际输入格式调整createFromFormat的第一个参数 $validDate = Carbon::createFromFormat('d/m/Y H:i', $request->appointment_date)->format('Y-m-d H:i:s'); // 写入数据 Appointment::create([ 'appointment_date' => $validDate, // 其他字段 ]);
- 检查对应模型的
$fillable配置,确保字段在白名单内:
// 对应模型文件中 protected $fillable = [ // 其他允许批量赋值的字段 'appointment_date', ];
- 可以调整Migration配置,给字段添加可空属性,避免零值出现:
$table->dateTime('appointment_date')->nullable();
- 排查阶段可以开启SQL监听,查看实际传入的参数是否符合预期:
// 临时添加到接口逻辑上方 \DB::listen(function ($query) { var_dump($query->sql, $query->bindings); });
内容的提问来源于stack exchange,提问作者Hakan Gundogan
相关产品推荐
相关产品推荐

