Laravel删除rekap记录时关联表与文件夹文件未删除修复方案
关联数据删除异常修复步骤
问题根因
当前删除逻辑存在3个核心缺陷:
- 控制器代码仅删除了
rekap主表数据,遍历关联的图片、附件记录时只处理了磁盘文件删除,完全没有编写image_rekap、file_rekap关联表的删除逻辑 - 文件路径使用相对路径书写,没有绑定项目实际的public/storage目录,大概率因为脚本执行工作目录不匹配,导致
File::exists()判断失败,磁盘文件无法被删除 - 前端跳转路径末尾拼接了多余空格,且错误使用GET请求执行删除操作,存在路由匹配异常、CSRF攻击风险
分步修复方案
1. 修正后端控制器删除逻辑
首先补全关联表记录删除代码,同时把文件路径替换为public_path()辅助函数生成的绝对路径,避免路径匹配错误;额外添加数据库事务保证操作原子性,不会出现部分删除成功的脏数据。
修正后的控制器代码如下:
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\File; public function delete_rekap($id){ // 开启事务,所有操作要么全成功要么全回滚 DB::beginTransaction(); try { $data = rekap::findOrfail($id); // 处理关联图片 $images = image_rekap::where("rekap_id", $data->id)->get(); foreach($images as $image){ $imagePath = public_path("images_rekap/".$image->image); if (File::exists($imagePath)) { File::delete($imagePath); } // 补全关联表记录删除逻辑 $image->delete(); } // 处理关联附件 $files = file_rekap::where("rekap_id", $data->id)->get(); foreach($files as $file){ $filePath = public_path("rekap_file/".$file->file); if (File::exists($filePath)) { File::delete($filePath); } // 补全关联表记录删除逻辑 $file->delete(); } // 删除主表记录 $data->delete(); DB::commit(); return redirect()->route('rekap')->with('success','Data berhasil dihapus'); } catch (\Exception $e) { DB::rollBack(); return redirect()->route('rekap')->with('error','删除失败:'.$e->getMessage()); } }
2. 修复前端跳转路径问题
原JS代码中跳转URL末尾拼接了多余空格,会导致路由参数异常,先把多余空格去掉;另外不要在跳转前提前弹出成功提示,页面跳转后原有JS上下文会被销毁,提前弹的提示不会正常展示,成功提示建议通过后端返回的闪存消息在列表页统一渲染。
修正后的JS代码片段:
$('.delete').click(function(){ var rekapid = $(this).attr('data-id'); var customer = $(this).attr('data-customer'); swal({ title: "Yakin", text: "Kamu akan menghapus data dengan nama "+customer+" ", icon: "warning", buttons: true, dangerMode: true, }) .then((willDelete) => { if (willDelete) { // 去掉URL末尾多余的空格 window.location = "/delete_rekap/"+rekapid } else { swal("Data tidak jadi dihapus"); } }); });
3. (可选安全优化)替换GET删除为POST请求
直接通过GET请求执行删除操作存在安全风险,容易被CSRF攻击触发误删,建议把删除接口改成POST DELETE路由,前端点击确认后动态提交携带CSRF令牌的表单,安全性更高。
内容的提问来源于stack exchange,提问作者ken thoriqi
相关产品推荐
相关产品推荐

