【问题标题】:Laravel eloquent doesn't insert data when bug occur during multiple insert多次插入期间发生错误时,Laravel eloquent 不插入数据
【发布时间】:2020-09-23 17:40:01
【问题描述】:

我正在尝试使用 csv 插入用户。 我的模型在“创建”事件上有一个观察者。

但是,由于我的函数中的代码创建了事件(我已修复),在一些 $users->save() 之后我可能会遇到错误。

created 事件中的代码向用户发送电子邮件。问题是如果代码在 5 次迭代后崩溃,我发送了 5 封电子邮件,但我的数据库中没有用户。

我想知道 Eloquent 是否在您多次调用 save() 时使用事务? 如果是,如何强制 Eloquent 在每次创建事件结束后真正保存我的对象?

可能是我对事件有误解,因为如果您不确定将模型插入数据库,我看不出使用此事件的意义。

【问题讨论】:

  • 您可能希望在单独的步骤中进行保存和电子邮件发送。一个事务,如果包装对->save() 的多个调用,如果其中任何一个失败(并且您已配置代码来处理),将阻止其中任何一个保存。不过,在这种情况下,您可能无法使用观察者。
  • 感谢您的回复,但我不明白为什么 Eloquent 似乎使用事务。我不是这个项目的原始所有者,所以也许我遗漏了一些雄辩的配置或文档。
  • 哦,我明白了!默认情况下,Laravel 和 Eloquent 不使用事务;如果您有一系列对->save() 的调用,它们一个一个地被持久化。检查您的代码是否有任何对 DB::beginTransaction() 的调用,因为这就是您通常的设置方式。

标签: laravel events eloquent batch-insert


【解决方案1】:

终于找到问题所在了……

要插入 csv 我的项目使用: https://github.com/Maatwebsite/Laravel-Excel

经过一些研究,在我的案例中,这就是“为什么”雄辩地使用交易: https://docs.laravel-excel.com/3.1/imports/validation.html#database-transactions

【讨论】:

    【解决方案2】:

    看看Eloquent Transactions。我对类似问题的处理方法如下:

        DB::beginTransaction();
    
        try {
    
            // Do your saving logic here
    
            DB::commit();
        } catch ( Throwable $e ) {
            // Didn't work, rollback.
            DB::rollBack();
        }
    

    【讨论】:

      猜你喜欢
      • 2015-09-19
      • 1970-01-01
      • 2014-12-08
      • 2017-05-12
      • 1970-01-01
      • 2016-03-16
      • 2017-10-16
      • 2019-05-25
      • 2019-06-24
      相关资源
      最近更新 更多