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

Laravel 5.5 模型日期字段$dateFormat显示失效,如何全局设置访问器?

解决Laravel模型日期字段全局法语格式(d/m/Y)展示问题

嘿,我刚好碰到过类似的问题,其实你踩了一个很容易混淆的Laravel小坑——$dateFormat属性其实是用来定义数据库存储时的日期格式,而不是前端展示的格式!这就是为什么你存储正常,但展示的时候它没起作用的原因。

下面给你两种优雅的全局实现方式,不用给每个字段写单独的访问器:

方法一:重写模型的serializeDate方法

Laravel的模型有一个serializeDate方法,专门用来处理日期字段的序列化逻辑(包括转成数组、JSON,或者直接在视图中输出)。你只需要在模型里重写这个方法,就能让所有$dates数组里的日期字段统一输出成d/m/Y格式:

class MyModel extends Model
{
    protected $dates = [
        'date_1',
        'date_2',
        'date_3',
        'date_4',
    ];

    /**
     * 自定义日期字段的序列化输出格式
     *
     * @param  \Illuminate\Support\Carbon  $date
     * @return string
     */
    protected function serializeDate(\Illuminate\Support\Carbon $date)
    {
        return $date->format('d/m/Y');
    }

    // ...其他模型代码
}

这样无论你是用{{ $model->date_1 }}在视图里展示,还是调用$model->toArray()返回数据,所有指定的日期字段都会自动以d/m/Y格式输出,完美替代单个字段的访问器。

方法二:创建基础模型实现全局复用

如果你有多个模型都需要这个日期格式,更高效的方式是创建一个基础模型,把serializeDate的重写放在里面,然后让所有需要的模型继承它:

首先创建BaseModel.php:

class BaseModel extends Model
{
    /**
     * 统一日期字段的序列化格式
     *
     * @param  \Illuminate\Support\Carbon  $date
     * @return string
     */
    protected function serializeDate(\Illuminate\Support\Carbon $date)
    {
        return $date->format('d/m/Y');
    }
}

然后让你的MyModel继承这个基础模型:

class MyModel extends BaseModel
{
    protected $dates = [
        'date_1',
        'date_2',
        'date_3',
        'date_4',
    ];

    // ...其他模型代码
}

这样所有继承BaseModel的模型都会自动应用这个日期格式,不用重复写代码。

补充说明:为什么getAttributes()没生效?

getAttributes()方法是用来获取模型的原始属性数组(从数据库里读出来的未处理值),它不会被Laravel用来处理属性的展示逻辑。所以你重写它并不会影响日期字段的输出,而serializeDate才是负责日期字段对外输出的关键方法。

内容的提问来源于stack exchange,提问作者Vincent Decaux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:47:42