You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9:id_jenisizin为1或2时表单数据无法存入数据库

问题排查与解决方案

1. 表单验证规则未做条件适配

核心问题大概率是验证规则未区分权限类别,导致选择Terlambat/Pulang Cepat时,jam_mulai和jam_selesai字段的验证逻辑缺失或错误,触发Laravel自动重定向。

解决方法:在控制器存储方法中添加动态验证规则,根据类别ID判断是否需要验证时间字段:

public function store(Request $request)
{
    // 基础验证规则
    $rules = [
        'kategori_id' => 'required|exists:kategoris,id',
        'tanggal' => 'required|date',
        // 其他必填字段(如员工ID、理由等)
    ];

    // 针对Terlambat(id=1)、Pulang Cepat(id=2)添加时间字段验证
    if (in_array($request->kategori_id, [1, 2])) {
        $rules['jam_mulai'] = 'required|date_format:H:i';
        $rules['jam_selesai'] = 'required|date_format:H:i|after:jam_mulai';
    }

    // 执行验证,失败则自动重定向回表单页面
    $validated = $request->validate($rules);

    // 验证通过后再执行存储逻辑
    $izin = Izin::create($validated);
    dd($izin); // 此时应该能正常输出
}

2. 动态表单字段渲染异常

如果前端用JS控制时间字段的显示/隐藏,可能存在字段被移除DOM或字段名拼写错误的情况,导致提交时jam_mulai/jam_selesai参数未传递,触发验证失败重定向。

解决方法:

  • 隐藏字段时不要删除DOM,仅用display:none控制显示,保留字段的name属性:
<div class="time-fields" style="display:none;">
    <div class="form-group">
        <label>Jam Mulai</label>
        <input type="time" name="jam_mulai" class="form-control" value="{{ old('jam_mulai') }}">
    </div>
    <div class="form-group">
        <label>Jam Selesai</label>
        <input type="time" name="jam_selesai" class="form-control" value="{{ old('jam_selesai') }}">
    </div>
</div>

<script>
document.getElementById('kategori_id').addEventListener('change', function() {
    const timeFields = document.querySelector('.time-fields');
    if (this.value == 1 || this.value == 2) {
        timeFields.style.display = 'block';
    } else {
        timeFields.style.display = 'none';
    }
});
</script>
  • 检查字段名与控制器接收的参数名完全一致,避免拼写错误(如jam_mulai写成jam_mulaii)。

3. 路由与请求方法错误

如果表单提交用了GET方法,会直接触发index路由跳转,导致store方法根本没执行。

解决方法:

  • 确保表单提交方法为POST,并包含CSRF令牌:
<form action="{{ route('izins.store') }}" method="POST">
    @csrf
    <!-- 表单字段 -->
</form>
  • 检查路由定义是否正确:
// 确保资源路由正确注册
Route::resource('izins', IzinController::class);

4. 控制器逻辑提前跳转

检查store方法中是否存在错误的提前跳转逻辑,比如:

// 错误示例:错误判断导致提前跳转
if ($request->kategori_id != 3) {
    return redirect()->route('izins.index');
}

如果有这类代码,会直接跳转到index.blade.php,导致dd($izin)无法执行。

5. 数据库字段配置检查

确保jam_mulai和jam_selesai字段允许空值(对应Sakit场景),同时字段类型为TIME:

CREATE TABLE izins (
    id INT AUTO_INCREMENT PRIMARY KEY,
    kategori_id INT NOT NULL,
    tanggal DATE NOT NULL,
    jam_mulai TIME NULL, -- 允许空
    jam_selesai TIME NULL, -- 允许空
    FOREIGN KEY (kategori_id) REFERENCES kategoris(id)
);

快速排查步骤

  1. 在store方法最顶部添加dd($request->all());,确认是否能接收到表单参数;
  2. 如果无输出,优先检查表单提交方法、路由是否正确;
  3. 如果能收到参数,检查验证规则是否适配不同类别;
  4. 验证前端动态字段是否正确渲染,参数是否正常传递。

内容的提问来源于stack exchange,提问作者akhiratunnisa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:01:26