Laravel+Backpack:更新前将表单日期格式转为mm/dd/yyyy
解决Laravel Backpack中日期格式转换存储的问题
我完全理解你的处境——虽然存储mm/dd/yyyy不符合数据库标准日期格式,但项目需求摆在这儿,必须这么做。结合Laravel和Backpack的特性,我给你几个靠谱的方案,按优先级推荐:
方案1:用Laravel模型修改器(最稳妥)
Laravel的**修改器(Mutator)**能自动处理字段赋值时的格式转换,不管你是通过Backpack的CRUD还是手动赋值,都会生效。
在你的对应模型(比如app/Models/YourModel.php)里添加以下代码:
public function setDateAttribute($value) { // 检查值是否存在,避免空值报错 if (!empty($value)) { // 把input返回的yyyy-mm-dd转成mm/dd/yyyy $carbonDate = \Carbon\Carbon::createFromFormat('Y-m-d', $value); $this->attributes['DATE'] = $carbonDate->format('m/d/Y'); } }
为什么推荐这个?
修改器是Laravel的原生特性,和Backpack完全兼容,不管你后续怎么扩展CRUD功能,这个转换逻辑都会自动执行,不用在多个地方重复写代码。
方案2:在Backpack的Request类中处理
如果你更倾向于在请求层面处理,可以在CRUD对应的Request类里修改数据:
找到你的Request文件(比如app/Http/Requests/YourModelRequest.php),添加prepareForValidation方法:
protected function prepareForValidation() { // 检查请求中是否有DATE字段 if ($this->has('DATE')) { $date = \Carbon\Carbon::createFromFormat('Y-m-d', $this->DATE); // 替换请求中的DATE字段为目标格式 $this->merge([ 'DATE' => $date->format('m/d/Y') ]); } }
这个方法会在验证请求数据之前执行,把前端传来的yyyy-mm-dd转成mm/dd/yyyy,再交给后续的保存逻辑。
注意:前端显示的反向转换
因为<input type="date">只接受yyyy-mm-dd格式的value,所以从数据库读取mm/dd/yyyy格式的日期时,要再转回去显示:
把你原来的视图代码改成这样:
<!-- Date--> @php // 把数据库里的mm/dd/yyyy转成input需要的yyyy-mm-dd $displayDate = \Carbon\Carbon::createFromFormat('m/d/Y', $entry->DATE)->format('Y-m-d'); @endphp <div class="form-group col-md-12"> <label>Date</label> <input type="date" name="DATE" id="DATE" value="{{ $displayDate }}"> </div>
重要提醒
确保你的数据库DATE字段是字符串类型(比如varchar(10)或者text),如果用了date类型的字段,数据库会因为格式不合法拒绝存储,这一点一定要注意!
内容的提问来源于stack exchange,提问作者Braedon Saunders
相关产品推荐
相关产品推荐

