Laravel 5.6.12中可为空datetime字段存入0000-00-00问题求助
解决Laravel 5.6中Datetime字段存入
0000-00-00 00:00:00而非Null的问题 这个问题我之前在旧版本Laravel+MySQL的组合里也碰到过,主要是MySQL配置或者Laravel模型字段处理逻辑这两个方面的问题,给你几个可行的解决步骤:
1. 调整Laravel模型的字段转换配置
如果你的MyModel里把End_Date加入了$dates数组,Laravel的日期自动处理可能会把null强制转换成默认的0000格式。试试把$dates换成$casts,明确指定该字段为允许null的datetime类型:
class MyModel extends Model { // 移除原来的$dates配置,替换为以下$casts protected $casts = [ 'Start_Date' => 'datetime', 'End_Date' => 'datetime:nullable', ]; }
这样Laravel会正确识别字段允许为null的属性,不会强制转换为无效的日期值。
2. 修改MySQL的sql_mode配置
MySQL在非严格模式下,会自动将null转换为0000-00-00 00:00:00来替代报错,这是很多人容易忽略的点。
操作步骤:
- 登录MySQL终端,执行命令查看当前sql_mode:
SELECT @@sql_mode; - 如果输出里包含
NO_ZERO_DATE、NO_ZERO_IN_DATE,或者没有STRICT_TRANS_TABLES,需要修改MySQL的配置文件(Linux一般是/etc/my.cnf或/etc/mysql/my.cnf,Windows是my.ini):[mysqld] sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION" - 重启MySQL服务后,再测试插入null值的效果。
3. 检查模型的自定义字段Mutator
如果你的模型里写了setEndDateAttribute这类自定义字段赋值方法,要确认它没有把null转换成0000-00-00 00:00:00。比如下面这种错误写法需要修正:
// 错误示例:强行把null转为0000格式 public function setEndDateAttribute($value) { $this->attributes['End_Date'] = $value ?: '0000-00-00 00:00:00'; }
改成允许null的处理逻辑:
public function setEndDateAttribute($value) { $this->attributes['End_Date'] = $value ? \Carbon\Carbon::parse($value) : null; }
验证测试
修改完成后,重新运行你的插入代码,再查看数据库。如果还是有问题,可以先尝试用原生SQL插入测试,排除Laravel的影响:
INSERT INTO mytable (Start_Date, End_Date) VALUES (NOW(), NULL);
如果原生SQL插入后字段显示为null,说明问题出在Laravel模型的配置上;如果还是0000-00-00 00:00:00,那就是MySQL的配置还没修改到位。
内容的提问来源于stack exchange,提问作者Pankaj
相关产品推荐
相关产品推荐

