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

Eloquent读取MySQL可空date列返回0000-00-00如何解决?

问题原因分析
  • 首先排查数据库实际存储值:先执行原生SQL SELECT date_to FROM table_name WHERE id = 测试记录ID 确认字段实际值是否为真NULL,避免业务代码在写入时误将0000-00-00作为空值写入数据库。
  • 数据库连接配置问题:Laravel的MySQL连接配置中如果关闭了严格模式(strict => false),MySQL会默认将空日期字段转换为0000-00-00返回,而非返回NULL。
  • 日期属性配置过时:你当前使用的$dates属性是Laravel早期版本的日期转换配置,在5.8版本之后官方已推荐使用$casts属性做类型转换,旧写法在部分版本中存在空日期处理的兼容问题。
修复方案

方案1:调整数据库连接配置(推荐,根源解决)

打开config/database.php,找到MySQL连接配置项,将strict参数设置为true:

'mysql' => [
    // 其余现有配置保持不变
    'strict' => true,
    // 其余现有配置保持不变
],

如果业务需要关闭严格模式,可在modes数组中添加NO_ZERO_DATE参数:

'mysql' => [
    // 其余现有配置保持不变
    'strict' => false,
    'modes' => [
        'NO_ZERO_DATE',
        // 其余需要保留的mode参数
    ],
    // 其余现有配置保持不变
],

方案2:替换日期转换配置

将模型中的$dates属性删除,替换为$casts配置:

<?php

use Illuminate\Database\Eloquent\Model;

class MyModel extends Model
{
    protected $table = 'table_name';
    public $timestamps = false;

    protected $fillable = [
        'member_id',
        'date_from',
        'date_to',
    ];

    // 旧配置删除
    // protected $dates = [
    //     'date_from',
    //     'date_to',
    // ];
    
    // 新增casts配置
    protected $casts = [
        'date_from' => 'date:Y-m-d',
        'date_to' => 'date:Y-m-d',
    ];

}

临时方案说明

你当前使用的访问器方案可正常生效,但属于业务层补丁,仅适用于无法修改底层配置的场景,条件允许的情况下优先选择前两种方案从根源解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:57:03