我有一个带有Postgres数据库的Laravel项目。我对日期格式有一些问题。
这是Laravel刀片中的一个输入字段
<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) ?
CarbonCarbon::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:在"y/M/d"中,保存操作有效,但当用户使用小部件(输入字段(更改日期时,它会以y/M/d格式显示。
在控制器中,我只需取请求的日期出生字段的值,将其分配给对象并保存。我希望避免每次保存/编辑对象时在控制器中进行格式转换
处理这种情况的正确方法是什么?
有什么方法可以避免每次保存前都转换数据格式吗?
value
属性包含ISO 8601YYYY-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",
];
}
如果要将Date从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');
我已经使用突变子解决了问题:
public function setBirthDateAttribute($value)
{
if( $value ){
$data = Carbon::createFromFormat('d/m/Y', $value)->format('Y-m-d');
$this->attributes['birthDate'] = $data;
}
}