SQLSTATE[23000]约束违反:id_ibu字段不可为空问题求助
解决SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id_ibu' cannot be null问题
问题描述
执行数据插入时触发数据库约束错误:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id_ibu' cannot be null
对应的SQL插入语句:
insert into `ibuhamils` (`id_ibu`, `berat_badan`, `tinggi_badan`, `lila`, `t_darah`, `keluhan`, `tgl_periksa`, `updated_at`, `created_at`) values (?, 54, 159, 20, 120/80, Tidak Ada, 2023-08-25, 2023-08-25 11:57:40, 2023-08-25 11:57:40)
问题根源
前端表单的id_ibu下拉框默认选项值为空字符串,部分浏览器对HTML原生required属性的校验不严格,允许提交空值;后端未做数据校验,直接将空值传入数据库,触发非空约束。
修复方案
1. 强化前端表单校验
修改下拉框默认选项,确保用户必须选择有效选项才能提交:
<select class="form-control" name="id_ibu" style="width: 100%;" required> <!-- 移除selected属性,强制用户主动选择 --> <option value="">-- Nama Ibu --</option> @foreach($users as $datas) <option value="{{ $datas->id_ibu}}">{{ $datas->nama_ibu }}</option> @endforeach </select>
如果浏览器仍允许提交空值,可添加JS辅助校验:
document.querySelector('form').addEventListener('submit', function(e) { const select = document.querySelector('select[name="id_ibu"]'); if (select.value === '') { e.preventDefault(); alert('Silakan pilih nama ibu terlebih dahulu'); } });
2. 后端添加数据验证
在控制器store方法中添加Laravel验证规则,拦截无效数据:
public function store(Request $request){ // 数据校验规则 $validated = $request->validate([ 'id_ibu' => 'required|exists:ibu_table,id_ibu', // 替换ibu_table为实际关联表名 'berat_badan' => 'required|numeric', 'tinggi_badan' => 'required|numeric', 'lila' => 'required|numeric', 't_darah' => 'required|string', 'keluhan' => 'nullable|string', 'tgl_periksa' => 'required|date', ]); // 使用校验后的数据创建记录 Ibuhamil::create($validated); Alert::success('Data Berhasil Ditambah'); return redirect()->route('ibuhamil')->with([ 'success' => 'Data Berhasil Di Tambah' ]); }
3. 确认模型可填充字段
检查Ibuhamil模型的$fillable数组,确保包含id_ibu:
class Ibuhamil extends Model { protected $fillable = [ 'id_ibu', 'berat_badan', 'tinggi_badan', 'lila', 't_darah', 'keluhan', 'tgl_periksa', ]; }
内容的提问来源于stack exchange,提问作者Rakhmad Maulana
相关产品推荐
相关产品推荐

