复选框未勾选提交时报NULL错误,期望传入0的问题求助
问题根源
浏览器默认行为:未勾选的复选框不会被包含在表单提交数据中。你用JS设置了value=0,但没勾选时这个input字段根本不会被提交到后端,导致Laravel接收不到exams参数,数据库非空字段就抛出了cannot be null的错误。
解决方案
两种实用方法,任选其一即可:
方法1:添加隐藏字段(推荐)
在每个复选框前加一个同名隐藏输入框,值设为0。未勾选时,隐藏字段会被提交;勾选时,复选框的1会覆盖隐藏字段的0(注意顺序:隐藏字段要放在复选框前面)。
示例代码:
<!-- exams字段 --> <input type="hidden" name="exams" value="0"> <input type="checkbox" id="exams" name="exams" value="1"> <!-- materials字段 --> <input type="hidden" name="materials" value="0"> <input type="checkbox" id="materials" name="materials" value="1"> <!-- notes字段 --> <input type="hidden" name="notes" value="0"> <input type="checkbox" id="notes" name="notes" value="1"> <!-- course_live字段 --> <input type="hidden" name="course_live" value="0"> <input type="checkbox" id="course_live" name="course_live" value="1"> <!-- schedule字段 --> <input type="hidden" name="schedule" value="0"> <input type="checkbox" id="schedule" name="schedule" value="1">
这种方式不依赖JS,纯HTML规则就能解决,稳定性拉满。
方法2:后端补默认值
不想改前端的话,就在Laravel控制器里给这些字段设默认值,确保没接收到参数时自动用0填充。
示例控制器代码:
public function store(Request $request) { $data = $request->all(); // 给每个复选框字段设置默认值0 $data['exams'] = $request->input('exams', 0); $data['materials'] = $request->input('materials', 0); $data['notes'] = $request->input('notes', 0); $data['course_live'] = $request->input('course_live', 0); $data['schedule'] = $request->input('schedule', 0); // 保存到数据库 YourModel::create($data); }
input()方法的第二个参数就是默认值,请求里没这个字段时就会用它。
小提醒:你的JS有语法错误
看你提供的JS代码,选择器里#course_live,, #schedule多了个逗号,改成#course_live, #schedule就行,虽然不影响当前问题,但修复后能避免其他潜在bug:
$('#exams, #materials, #notes, #course_live, #schedule').on( 'change', function() { this.value = this.checked ? '1' : '0'; }).change();
内容的提问来源于stack exchange,提问作者Imdadullah Babu
相关产品推荐
相关产品推荐

