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

Laravel执行SELECT查询出现"A four digit year could not be found"错误

错误产生原因
  • 该错误是Carbon日期解析库解析非法日期格式时抛出的,和你编写的name字段查询逻辑没有直接关联
  • Laravel Eloquent模型默认会将created_at、updated_at两个内置字段自动转为Carbon对象,如果你在Category模型的$dates属性中手动添加了其他自定义字段,这些字段也会被自动尝试做日期转换
  • 当上述被配置为自动日期转换的字段,数据库中存储的值不是Y-m-d H:i:s这类标准日期格式,甚至存储的是非日期类内容时,Carbon解析失败就会抛出"A four digit year could not be found"错误
  • 两种写法都触发错误的原因是:只要查询返回了Category模型实例,就会自动触发全局的日期字段转换逻辑,和你最终是否读取name字段无关
解决方案
  • 首先校验数据表对应字段的存储内容
    检查categories表的created_at、updated_at以及Category模型$dates属性中定义的所有字段,确认存储的内容是否为合法的日期格式,如果存在脏数据先清理脏数据
  • 调整模型日期转换配置
    如果对应字段本身就不是用来存储日期的,在Category模型中添加对应配置关闭自动转换即可:
    // 关闭默认的created_at、updated_at自动日期转换
    public $timestamps = false;
    
    // 清空$dates数组,或者仅保留确实为日期类型的字段
    protected $dates = [];
    
  • 优化查询写法(可选,可规避转换问题同时提升性能)
    如果你仅需要获取name字段的值,不需要获取完整模型实例,优先使用第一种value()写法即可,该写法只会查询指定的name字段,不会实例化模型,也就不会触发日期字段转换逻辑。
    第二种写法存在语法错误:find(20)返回的是单条模型实例,不需要调用get()方法,直接读取属性即可:
    // 正确的单实例字段读取写法
    $name = Category::find(20)->name;
    // 可加上空判断避免数据不存在时报错
    $name = Category::find(20)?->name;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:36:05