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

Laravel 8更新Awarding Body时coursecategory字段不能为空错误如何解决

问题根本原因

报错核心是提交更新请求时,coursecategory字段没有拿到有效值,直接传入了空值,而数据库中该字段设置了不允许为null,所以触发了完整性约束报错。具体问题和修复方案如下:


1. 下拉选项未设置value属性(核心问题)

你表单里的coursecategory下拉框所有<option>都没有写value属性,浏览器提交表单时只会读取value的值,没有value就会默认传空;同时默认选项的value直接设成了空值,如果你没有重新选择分类,提交的就是空值。另外你还多写了一个重复的</select>闭合标签,可能导致表单解析异常。

修复后的下拉框代码如下:

<div class="form-group">
    <h5>Course Category <span class="text-danger">*</span></h5>
    <select name="coursecategory" class="form-control select2" style="width: 100%;" required>
        <option value="">请选择课程分类</option>
        @foreach($coursecategories as $category)
        <option value="{{ $category->name }}" {{ $editData->coursecategory == $category->name ? 'selected' : '' }}>
            {{$category->name}}
        </option>
        @endforeach
    </select>
    @error('coursecategory')
    <span class="text-info">{{ $message }}</span>
    @enderror
</div>

本次修改点:

  • 给每个
  • 增加selected自动判断,打开编辑页时默认选中当前记录已保存的分类,不需要用户重新选择
  • 删除多余的重复</select>闭合标签
  • 给select加上required属性,前端先校验必须选择,避免用户漏选
  • 把错误提示的字段从name改为coursecategory,你原来所有字段的错误提示都判断的是@error('name'),其他字段报错根本不会显示

2. 后端增加参数校验(强烈建议)

避免前端校验失效的情况,在AwardingBodyUpdate方法开头加上参数校验,就算传了空值也会返回明确的表单报错,不会直接触发数据库异常:

public function AwardingBodyUpdate(Request $request, $id) {
    // 新增参数校验
    $request->validate([
        'name' => 'required',
        'description' => 'required',
        'coursecategory' => 'required',
        'issuedate' => 'required|date',
        // 其他需要校验的字段可以自行补充
    ]);

    $data = AwardingBody::find($id);
    // 原有逻辑保持不变

3. 额外拼写错误检查

你控制器里查询课程分类的模型名CourseCatergory大概率是拼写错误,正确拼写应该是CourseCategory,如果模型名写错,下拉框压根拿不到分类数据,也会导致用户没有可选的选项,只能提交空值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:15:03