Laravel获取复选框值存入tinyint时触发非空约束报错
解决Laravel复选框存入tinyint字段时的非空约束错误
首先得把问题根源说清楚:HTML复选框有个容易被忽略的特性——如果没被勾选,浏览器不会把这个字段提交给服务器。所以当用户没勾选o3的时候,$request->input('o3')拿到的是null,而你的数据库choice3字段是不允许为null的tinyint类型,这就触发了Integrity constraint violation错误。
下面给你几个简单直接的解决方案:
方案1:在控制器里给请求字段设置默认值
直接在获取请求参数时,给input()方法加个默认值0,这样不管复选框有没有被勾选,都能拿到合法的数值:
// 修改控制器代码 $vote->choice3 = $request->input('o3', 0);
同时记得把复选框的提交值改成1(你现在第二个参数是空字符串,存tinyint用1/0更合理):
{{Form::checkbox('o3', 1, false, ['class' => 'form-control med-width'])}}
这样勾选时提交1,未勾选时用默认值0,完美适配tinyint字段。
方案2:在表单里添加隐藏域兜底
在复选框前面加一个同名的隐藏域,值设为0。原理是:如果复选框没勾选,隐藏域的0会被提交;如果勾选了,复选框的1会覆盖隐藏域的值:
<div class="form-group col-md-2 col-4"> {{Form::label('o3', 'Option 3')}} {{Form::hidden('o3', 0)}} <!-- 新增这行隐藏域 --> {{Form::checkbox('o3', 1, false, ['class' => 'form-control med-width'])}} </div>
这种情况下,控制器里的代码不用改,$request->input('o3')永远能拿到0或1,直接存到tinyint字段里就没问题了。
额外提示
对于o1和o2两个复选框,你也需要用同样的方式处理,避免出现同样的错误。另外,建议在模型的验证规则里加上对这些字段的校验,进一步保证数据合法性:
// 在Vote模型的验证规则中 public static $rules = [ 'o1' => 'integer|in:0,1', 'o2' => 'integer|in:0,1', 'o3' => 'integer|in:0,1', // 其他字段规则... ];
内容的提问来源于stack exchange,提问作者Ellis Thompson
相关产品推荐
相关产品推荐

