问题描述
在我的刀片文件中,我有一个带有日期时间下拉列表的表单,可以这样选择:
<form method="POST" action="{{ route('admin.send-single') }}">
@csrf
<div>
<label>Hours:</label>
<select name="hour">
@for ($i=0; $i<=23; $i++)
<option value="{{ $i }}">{{ $i }}</option>
@endfor
</select>
<select name="minute">
@for ($i=0; $i<=59; $i++)
<option value="{{ $i }}">{{ $i }}</option>
@endfor
</select>
<label>Date:</label>
<select name="day">
@for ($i=1; $i<=31; $i++)
<option value="{{ $i }}">{{ $i }}</option>
@endfor
</select>
<select name="month">
@for ($i=1; $i<=12; $i++)
<option value="{{ $i }}">{{ $i }}</option>
@endfor
</select>
<select name="year">
@for ($i=2021; $i<=2030; $i++)
<option value="{{ $i }}">{{ $i }}</option>
@endfor
</select>
</div>
<div>
<button type="submit">Submit</button>
</div>
</form>
当我选择日期和时间时,然后我提交表单并像这样在控制器中处理它以获得 Y-m-d H:i:s 格式的日期时间:
$param = $request->except('_token');
$time = $param['year'].'-'.$param['month'].'-'.$param['day].' '.$param['hour'].':'.$param['minute].':00';
我认为这段代码不干净。无论如何让我做这个更干净?之前在刀片中将日期时间格式化为 Y-m-d H:i:s 然后提交给控制器?
非常感谢!
解决方法
如果您可以切换并且没有我目前不知道的未知原因,我不确定您为什么选择使用下拉输入字段作为日期:
-
<input type="date" />
https://www.w3schools.com/TAGS/att_input_type_date.asp
结合:
-
<input type="time" />
https://www.w3schools.com/tags/att_input_type_time.asp
您也可以尝试使用 datetime-local 输入字段,因为该字段类型同时包含时间和日期,但由于向后兼容,该类型并没有得到很好的支持。
-
<input type="datetime-local" />
https://www.w3schools.com/tags/att_input_type_datetime-local.asp
然后您可以像处理任何其他字段一样捕获控制器中的字段,如果您选择组合使用日期和时间字段类型,您可以执行以下操作:
$request->input( 'date_field' ) . ' ' . $request->input( 'time_field' )
不过我不建议这样做,您应该在保存之前预先格式化模型中的字段。
您可以使用访问器和修改器来做到这一点,请参阅: https://laravel.com/docs/8.x/eloquent-mutators
用这个替换你的表单:
<form method="POST" action="{{ route('admin.send-single') }}">
@csrf
<div>
<fieldset>
<label id="date-input-label">Date:</label>
<input name="date_field" type="date" min="2021-01-01" max="2030-12-31" aria-labelledby="date-input-label" />
<input name="time_field" type="time" aria-labelledby="date-input-label" />
</fieldset>
</div>
<div>
<button type="submit">Submit</button>
</div>
</form>
然后使用 mutator 组合字段,或者如果您愿意,可以在控制器中组合它们。
如果您选择组合控制器中的字段,您可以使用 Carbon 之类的东西来确保它兼容。
查看另一篇 Stack Overflow 帖子:
Combine multiple field input into single value in Laravel
碳: