Laravel自定义时间字段material_copied_at返回INT而非Carbon的问题
解决Laravel模型中material_copied_at返回INT而非Carbon实例的问题
我来帮你梳理下这个问题的原因和解决办法,Laravel里日期字段转Carbon实例的逻辑其实有几个关键细节容易忽略:
核心原因:字段类型与转换规则不匹配
你已经在模型里定义了$dates属性,但如果数据库中的material_copied_at字段是INT类型(存储Unix时间戳),Laravel默认的$dates属性只会自动处理datetime/timestamp类型的字段,不会识别INT类型的时间戳并转换为Carbon实例。
解决方案:使用$casts明确指定类型转换
最稳妥的方式是在模型中用$casts属性显式声明字段的转换类型,不管数据库存的是时间戳还是日期字符串,Laravel都会帮你转成Carbon实例。修改你的模型代码如下:
class ImportRequestForQuote extends Model { const STATUS_NEW = 'new'; const STATUS_MATERIALCOPIED = 'materialCopied'; public $table = 'import_request_for_quotes'; // 替换或补充$casts属性 protected $casts = [ 'material_copied_at' => 'datetime', // created_at/updated_at默认已被Laravel处理,可加可不加 'created_at' => 'datetime', 'updated_at' => 'datetime', ]; public $fillable = [ 'client_id', 'number', 'num_items', 'material_copied_from', // 其他你的字段... ]; }
额外排查点
如果上面的方法没生效,再检查这几个地方:
- 字段名拼写:确认模型里的
material_copied_at和数据库字段名完全一致(大小写、下划线都不能错) - 自定义Getter:检查模型里有没有写
getMaterialCopiedAtAttribute方法,如果有,要确保它返回的是Carbon实例,比如:public function getMaterialCopiedAtAttribute($value) { return \Carbon\Carbon::createFromTimestamp($value); } - 清除缓存:执行
php artisan cache:clear和php artisan config:clear,避免旧的模型缓存影响结果
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

