Laravel8删除指定数据库记录时始终误删第一条记录的问题求助
Laravel 8 删除操作始终删除第一条记录问题排查
问题现象
使用Laravel 8开发时,执行指定id的数据库记录删除操作,始终删除数据表中第一条记录,无法命中目标记录。
根因分析
核心问题出在前端表单与JS交互逻辑:
- 循环渲染的所有删除表单都设置了相同的
name="myForm"属性 - JS逻辑中通过
document.forms["myForm"]获取表单时,永远会匹配到页面中第一个同名表单,无论点击哪个删除按钮,提交的都是第一个表单内存储的id(即第一条记录的id),因此永远删除第一条数据 - 额外逻辑瑕疵:原代码中存储room_id的输入框为text类型,会在页面直接展示id值,不符合交互逻辑;控制器删除顺序为先删主记录再删关联记录,存在主记录删除成功但关联记录删除失败产生脏数据的风险。
修正代码
1. 视图层(Blade模板)
移除表单固定name属性,点击按钮时将当前表单实例传入JS方法,同时将id输入框改为隐藏域:
@foreach ($rooms as $value) <form action="{{route('room.destroy')}}" method="POST"> @csrf <input type="hidden" value="{{$value->id}}" name="room_id"> <button type="submit" class="btn bg-primary-light px-3 me-2 py-2" onclick="roomFunction(event, this.form)"> <i class='bx bx-trash'></i> </button> </form> @endforeach
2. 前端JS逻辑
接收传入的事件对象和当前表单实例,不再全局查询固定name的表单:
function roomFunction(event, form) { event.preventDefault(); // 阻止默认表单提交 swal({ title: "Are you sure?", text: "You won't be able to revert this!", type: "warning", showCancelButton: true, confirmButtonColor: "#4fa7f3", confirmButtonText: "Yes, delete it!", cancelButtonText: "No, cancel please!", closeOnConfirm: false, closeOnCancel: false }, function(isConfirm){ if (isConfirm) { form.submit(); } else { swal("Cancelled", "", "error"); } }); }
3. 控制器层(优化,可选)
增加参数校验,使用数据库事务保证数据一致性,调整删除顺序为先删关联数据再删主记录:
public function destroy(Request $request) { $request->validate([ 'room_id' => 'required|integer|exists:rooms,id' ]); $room = Room::find($request->room_id); \DB::transaction(function () use ($room) { RoomDetail::where('room_id', $room->id)->delete(); $room->delete(); }); return redirect()->route('room'); }
内容的提问来源于stack exchange,提问作者zubair syslab
相关产品推荐
相关产品推荐

