Laravel 8 用if语句条件更新数据库记录 空值保留方案
解决方案
你原有代码的问题在于直接对所有可空字段调用floatval()转换,而floatval(null)会返回0,即使请求参数为null,也会把数据库中原有的null值覆盖为0。另外你提到数据表没有主键,这一点不影响更新逻辑,你已经通过nim字段作为查询条件定位目标记录,完全可以正常执行更新。
实现逻辑如下:
- 先初始化更新数组,存入所有必填、每次都要更新的字段
- 逐个判断n1到n5的请求值,仅当值不为null时,才将对应字段加入更新数组
- 最后用构造完成的数组执行更新即可
修改后的完整代码如下:
public function store_upd_nilai_uji_program(Request $request) { $validated = $request->validate([ 'nip' => 'required|numeric|digits_between:18,18', 'n1' => 'nullable|numeric', 'n2' => 'nullable|numeric', 'n3' => 'nullable|numeric', 'n4' => 'nullable|numeric', 'n5' => 'nullable|numeric', 'n6' => 'required|numeric', 'tanggal' => 'required', 'waktu' => 'required', ]); // 构造固定更新的必填字段 $updateData = [ 'nip' => $request->nip, 'total' => floatval($request->n6), 'tanggal' => $request->tanggal, 'waktu' => $request->waktu, ]; // 可空字段仅当请求值非null时才加入更新列表,保留数据库原有值 if (!is_null($request->n1)) { $updateData['nilai_kemampuan_dasar_program'] = floatval($request->n1); } if (!is_null($request->n2)) { $updateData['nilai_kecocokan_algoritma'] = floatval($request->n2); } if (!is_null($request->n3)) { $updateData['nilai_penguasaan_program'] = floatval($request->n3); } if (!is_null($request->n4)) { $updateData['nilai_penguasaan_ui'] = floatval($request->n4); } if (!is_null($request->n5)) { $updateData['nilai_validasi_output'] = floatval($request->n5); } NilaiUjiProgram::where('nim', $request->nim)->update($updateData); return redirect('/prodi/daftar_nilai_uji_program')->with('status', 'Nilai berhasil diperbaharui!'); }
补充说明:如果前端表单空提交时传的是空字符串而非null,可以将判断条件调整为
if ($request->filled('nX')),Laravel的filled方法会自动过滤空字符串、null等空值,同时保留合法的0值,避免误跳过有效评分。按你当前的验证规则,空参数会自动转换为null,现有判断逻辑已经可以正常工作。
内容的提问来源于stack exchange,提问作者monika
相关产品推荐
相关产品推荐

