Laravel Resource返回日期对象而非日期值问题求助
解决Laravel 5.6 Resource返回日期对象而非字符串的问题
嘿,我刚好碰到过一模一样的问题,给你几个实用的解决思路:
首先得明确原因:Laravel 5.6开始,Eloquent模型的日期字段默认会被转为Carbon实例,当你在Resource的toArray方法里直接返回这个Carbon对象时,框架会自动把它序列化成那个包含date、timezone的嵌套对象结构。你配置的$casts其实是用来把数据库存储的字符串转成Carbon对象的,它管的是数据输入转换而非输出格式化,所以才会看起来完全没效果。
下面是两种快速解决的方式:
方式一:在Resource里手动格式化日期
直接在toArray方法里调用Carbon的格式化方法,把对象转成你想要的字符串格式:
class OfferResource extends Resource { /** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'created_at' => $this->created_at->format('Y-m-d'), // 如果需要带时分秒的格式,可以用 toDateTimeString(): // 'created_at' => $this->created_at->toDateTimeString() ]; } }
方式二:全局配置Carbon的序列化规则
如果你的项目里很多地方都需要统一的日期输出格式,可以在App\Providers\AppServiceProvider的boot方法里添加全局的Carbon序列化规则,这样所有Carbon对象在被序列化时都会自动转成指定格式的字符串:
use Carbon\Carbon; public function boot() { Carbon::serializeUsing(function ($carbon) { return $carbon->format('Y-m-d'); }); }
这样不管是在Resource里直接返回$this->created_at,还是其他地方返回Carbon对象,都会输出你想要的字符串格式,不用每个地方都手动处理。
内容的提问来源于stack exchange,提问作者gileneusz
相关产品推荐
相关产品推荐

