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

