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

Laravel 8导入非RA类文件时caricamenti上传记录表不存储数据求助

问题根源分析
  • 核心原因是事务未正确闭合导致数据回滚:你在salvaEsitiAG方法中每次调用都会执行DB::beginTransaction()开启事务,但你注释掉的elseif分支逻辑里,开启事务后直接return返回结果,既没有执行DB::commit()也没有执行DB::rollBack(),导致事务层级计数异常。Laravel的事务是栈结构,每调用一次beginTransaction层级+1,需要对应次数的commit才能真正提交所有事务。如果整个请求结束后还有未提交的事务,Laravel会自动回滚所有未提交的操作,所以你后续的Caricamenti->save()操作虽然执行了,但最后被一起回滚了。你在save前后dd能看到正确数据,是因为dd在事务回滚之前执行,此时模型的属性已经赋值成功,只是事务未提交所以数据没有持久化到数据库。
  • RA类型文件导入无问题,是因为RA对应的导入逻辑中事务都能正确闭合,没有出现事务悬挂的情况。
修复方案
  • 补全elseif分支的事务回滚逻辑:在原有elseif分支中先回滚事务再返回结果,代码修改如下:
}elseif(empty($racc) && !empty($line[0])){
    DB::rollBack(); // 新增这行,回滚当前开启的事务
    // 原有日志和返回逻辑保持不变
    Log::channel('custom_log')->info('Esito della raccomandata con cartella:'.$line[0].' non caricato con successo da parte dell\'utente '. Auth::user().' la raccomandata non esiste sul DB');
    return ['warning' => 'Esito della raccomandata con numero cartella: '.$line[0].' non inserito! Controllare l\'esistenza della raccomandata! '];
}
  • 优化事务使用逻辑:当前单条记录就开启一个事务,大批量导入时性能极差,建议把事务提到循环外层,整个导入过程共用一个事务,要么全部成功要么全部回滚,避免频繁开启关闭事务。
  • 可临时验证:在Caricamenti->save()之后新增一行DB::commit(),如果加完后能正常写入caricamenti表,即可100%确认是事务未闭合导致的问题。
  • 兜底检查:确认Caricamenti模型的$fillable属性中已经包含nome_file、file_path、note、tipo_caricamento这几个字段,允许批量赋值(RA类型能正常写入的话该问题概率极低)。

内容的提问来源于stack exchange,提问作者64Bit1990

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:18:01