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

