Laravel存储Datepicker日期到MySQL显示0000-00-00如何解决
问题产生原因
- 最核心的原因是
Post模型未将startdatum、enddatum两个字段加入$fillable批量赋值白名单。Laravel执行create()批量赋值时会自动过滤不在白名单内的字段,相当于这两个字段未传入,MySQL就会使用默认的0000-00-00作为值,你之前加Carbon::parse无效也是因为字段被过滤了。 - 次要原因是未在模型中配置日期字段的类型转换,Laravel无法识别这两个字段是日期类型,也可能导致存储异常。
- 小概率原因是数据库表的对应字段类型不是
date/datetime,或者前端传入的日期格式不符合数据库要求。
解决步骤
- 打开你的
App\Models\Post.php模型文件,将两个日期字段加入$fillable数组:
protected $fillable = [ 'titel', 'standort', 'kontakt', 'startdatum', 'enddatum', 'beschreibung', // 其他允许批量赋值的字段 ];
- 同样在
Post模型中添加日期字段类型配置,二选一即可:
方式一(兼容所有Laravel版本):
protected $dates = [ 'startdatum', 'enddatum', // 其他日期类型字段 ];
方式二(Laravel7+推荐):
protected $casts = [ 'startdatum' => 'date:Y-m-d', 'enddatum' => 'date:Y-m-d', // 其他字段的类型转换规则 ];
- 完成上述配置后你最初的控制器代码即可正常运行,不需要额外手动用
Carbon::parse处理日期。如果还是存储异常,可以打印create方法返回的实例检查字段是否正常赋值:
$post = $request->user()->posts()->create([ // 你的字段赋值逻辑 ]); dd($post);
如果返回的实例中日期字段有值但数据库无值,检查数据库表对应字段的类型是否为date或datetime即可。
内容的提问来源于stack exchange,提问作者Frevelman
相关产品推荐
相关产品推荐

