You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:57:34