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

