在laravel中使用日期格式的正确方法

问题描述

我有一个带有 Postgres 数据库的 Laravel 项目。我在日期格式方面遇到了一些问题。

这是Laravel Blade中的一段输入字段

<div class="form-group col-md-3">
     <label for="nome" class="required">
       Birth Date
     </label>
     <input class="form-control date" type="text"value="{{ (!empty($patient) && $patient->datebirth) ? 
     Carbon\Carbon::parse($patient->datebirth)->format('d/m/Y') : '' }}"  name="datebirth" 
     id="datebirth" />
</div>

这是激活引导日期字段的脚本

$(document).ready(function() {
    $('.date').datepicker({
        firstDayOfWeek: 1,// The first day of week is Monday
        weekDayFormat: 'narrow',// Only first letter for the weekday names
        inputFormat: 'd/M/y',outputFormat: 'd/M/y',titleFormat: 'EEEE d MMMM y',markup: 'bootstrap4',theme: 'bootstrap',modal: false
    });
});

这是控制器代码

public function save(Request $req){
    $validatedData  = $req->validate([
        'name' => ['required','max:255'],'datebirth' => ['required','date'],]);

   $newPatient = new Patient;
   $newPatient->name = $req->name;
   $newPatient->datebirth = $req->datebirth;
   $newPatient->save();
}

但是当我保存对象时,错误是:

sqlSTATE[22008]: Datetime field overflow: 7 ERROR: date/time field value out of range: "22/04/1985"...

因为数据库需要 y m d 格式,但我想在我的视图中使用 d/M/y。我更改了 outputFormat: in 'y/M/d' 保存操作有效,但是当用户使用小部件(输入字段)更改日期时,它以 y/M/d 格式显示

在控制器中,我只是获取请求的 datebirth 字段的值,我将它分配给对象并保存它。我想避免每次保存/编辑对象时在控制器中进行格式转换

处理这种情况的正确方法是什么?

有什么办法可以避免每次保存前都转换数据格式?

解决方法

date input expects value 属性包含 ISO 8601 YYYY-mm-dd 格式的数据。由于您正在请求日期,因此使用此输入类型是填写表单的正确方法。当作为字符串回显时,Carbon 默认会转换为 ISO 8601。

<div class="form-group col-md-3">
    <label for="nome" class="required">
        Birth Date
    </label>
    <input
        type="date"
        class="form-control"
        value="{{ ($patient->datebirth ?? false) ? $patient->datebirth->toDateString() : '' }}"
        name="datebirth" 
        id="datebirth"
    />
</div>

在发出请求时,输入将以 ISO 8601 格式发送到服务器。但是,如果您正确设置了模型,Laravel 会在保存期间自动处理格式。例如

class Patient extends Model
{
    protected $dates = [
        "datebirth",];
}
,

如果要将日期从 DD/MM/YYYY 格式转换为 YYYY/MM/DD(后跟数据库日期数据类型以及时间戳数据类型)

$date = $request->deal_date; //we got DD/MM/YYYY format date from form post data
$deal_date = date('Y-m-d',strtotime($date)); 

然后您可以修改 Laravel 请求数组数据,然后将该数组数据传递给数据库

$request->merge([
     'deal_date' => $deal_date,]);

或者你想在请求中添加任何字段然后你可以喜欢这个

$request->request->add(['user_id' => $user_id]);

或者你想从请求中删除任何字段,那么你也可以这样做

$request->request->remove('store_idname');
,

我已经使用 mutator 解决了这个问题:

public function setBirthDateAttribute($value)
    {
        if( $value ){
            $data = Carbon::createFromFormat('d/m/Y',$value)->format('Y-m-d');
            $this->attributes['birthDate'] = $data;
        }
    }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...