Laravel中存入数据库的timestamp取出后转为字符串无法调用方法如何解决?
问题原因
Laravel默认仅会对内置的created_at、updated_at两个时间字段做Carbon实例自动转换,public $timestamps = true的作用只是控制这两个字段是否自动写入,不会作用于你自定义的start_at时间字段,因此从数据库取出的start_at是原生字符串格式,无法调用Carbon的方法。
可行解决方案
方案1:使用$dates属性配置自定义时间字段
在对应Model中添加$dates属性,将start_at加入配置列表即可,Laravel会自动在该字段存取时转换为Carbon实例:
protected $dates = [ 'start_at', // 其他自定义时间字段可一并加入 ];
该配置兼容Laravel全版本,添加后直接调用$user->start_at->lte(now())即可正常运行。
方案2:使用$casts属性显式指定类型转换(推荐Laravel 8+版本使用)
Laravel 8及以上版本更推荐使用$casts做字段类型声明,配置方式如下:
protected $casts = [ 'start_at' => 'datetime', // 其他字段类型配置 ];
该方式支持更多自定义转换规则,灵活性更高。
临时解决方案:手动转Carbon实例
如果不想改动模型配置,可以在调用方法前手动转换:
Carbon::parse($user->start_at)->lte(now())
该方式仅适合临时调用场景,不推荐高频使用,重复解析会产生不必要的性能开销。
内容的提问来源于stack exchange,提问作者schutte
相关产品推荐
相关产品推荐

