Laravel中如何转换时间格式?无需访问器实现08:00:00转08:00
问题解答
很遗憾的告诉你,你尝试的这种'time:H:i'格式配置$casts的方式是行不通的。
Laravel的$casts属性里,time类型的作用是把数据库的time字段转换成Carbon实例(或者DateTimeInterface的实现类),它并不支持在time后面直接追加格式化字符串——time类型的cast只接受单纯的'time'作为配置值,带额外参数的写法会被框架识别错误,甚至可能抛出异常。
那不想用访问器的话,有哪些替代方案呢?给你几个思路:
- 手动格式化属性:因为
opens和closes会被自动转为Carbon实例,你可以在获取的时候直接调用format方法,比如$yourModel->opens->format('H:i'),这样就能得到08:00这样的字符串。 - 查询时直接格式化:如果是从数据库查询的时候就想拿到格式化后的结果,可以用数据库的原生函数处理,比如MySQL的
TIME_FORMAT:
这样查询结果里的$models = YourModel::selectRaw('*, TIME_FORMAT(opens, "%H:%i") as opens_formatted, TIME_FORMAT(closes, "%H:%i") as closes_formatted')->get();opens_formatted和closes_formatted就是你想要的格式了。 - 全局序列化格式化(谨慎使用):如果你是需要在序列化模型(比如返回API响应)时统一格式化时间,可以重写模型的
serializeDate方法:
注意这个方法会影响模型里所有日期时间类型的字段序列化,如果只有protected function serializeDate(\DateTimeInterface $date) { return $date->format('H:i'); }opens和closes需要特殊处理,这个方法可能不太合适,还是手动格式化更精准。
总结一下:$casts里的time类型不支持自定义格式,你得通过上面这些方式来实现需求。
内容的提问来源于stack exchange,提问作者Philipp Mochine
相关产品推荐
相关产品推荐

