MySQL 1048约束错误:sdoh_category_id字段不可为空排查求助
问题排查:Integrity constraint violation: 1048 Column 'sdoh_category_id' cannot be null
错误信息
Integrity constraint violation: 1048 Column 'sdoh_category_id' cannot be null
问题描述
尝试将下拉框数据存入数据库时,系统提示sdoh_category_id字段不可为空,但dump请求数据时发现该字段并非为空。
控制器代码
public function store(Request $request) { $household = new HouseholdHead; $household->name = $request->name; $household->purok_id = $request->purok; $household->env_hazard_id = $request->hazards; $household->number_of_adults = $request->adults; $household->save(); $categories = ['religion', 'residence', 'type', 'toilet', 'water_source','garbage', 'alcohol','dental', 'h_service', 'm_service', 'routine', 'exposure', 'reasons', 'insurance', 'info', 'w_hazards', 'c_hazards', 'unmet', 'improve', 'screening' ]; foreach ($categories as $category) { $sdohCategory = new SDOHCategoryHousehold(); $sdohCategory->household_head_id = $household->id; $sdohCategory->sdoh_category_id = $request->get($category); $sdohCategory->save(); } return redirect()->route('admin.household.index')->with('success', 'Household Added Successfully!'); }
请求数据截图

原因分析及解决建议
核心原因
从截图和代码对比来看,categories数组中的部分键与请求数据的字段名不匹配:
- 数组里的
w_hazards对应请求里的w_hazard - 数组里的
c_hazards对应请求里的c_hazard
这类拼写差异会导致$request->get($category)返回null,触发数据库的非空约束报错。
另外还有两种可能的辅助原因:
- 部分下拉框未被用户选中,前端未提交对应字段,导致
$request->get($category)返回null - 前端提交了空字符串(
""),而数据库字段要求整数类型,自动转换后变为null
解决步骤
修正字段名匹配问题
把categories数组中的w_hazards改为w_hazard,c_hazards改为c_hazard,确保和请求字段完全一致。添加空值过滤逻辑
在循环中先判断请求值是否有效,避免空值存入数据库:foreach ($categories as $category) { $categoryId = $request->get($category); // 过滤null和空字符串 if ($categoryId !== null && $categoryId !== '') { $sdohCategory = new SDOHCategoryHousehold(); $sdohCategory->household_head_id = $household->id; $sdohCategory->sdoh_category_id = $categoryId; $sdohCategory->save(); } }前端增强校验
给所有下拉框设置默认选中值,确保用户未主动选择时也能提交有效数据,避免漏传字段。数据库字段适配
如果业务允许部分sdoh_category_id为空,可以修改数据库表结构,取消该字段的非空约束;如果业务要求必须非空,则严格确保前端提交所有必填字段。
内容的提问来源于stack exchange,提问作者Big Brother
相关产品推荐
相关产品推荐

