微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Laravel 中提交表单时处理日期时间字段

如何解决在 Laravel 中提交表单时处理日期时间字段

在我的刀片文件中,我有一个带有日期时间下拉列表的表单,可以这样选择:

<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 然后提交给控制器?

非常感谢!

解决方法

如果您可以切换并且没有我目前不知道的未知原因,我不确定您为什么选择使用下拉输入字段作为日期:

结合:

您也可以尝试使用 datetime-local 输入字段,因为该字段类型同时包含时间和日期,但由于向后兼容,该类型并没有得到很好的支持。

然后您可以像处理任何其他字段一样捕获控制器中的字段,如果您选择组合使用日期和时间字段类型,您可以执行以下操作:

$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&#58;</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

碳:

https://carbon.nesbot.com/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。