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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:29:27