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
相关产品推荐
相关产品推荐

