保存子模型时遇到错误,Laravel回滚保存更改

时间:2019-02-18 02:37:14

标签: php laravel laravel-5

例如,我有一个用户hasMany Books关系。

让我们采取这种情况。

成功保存了User(父模型),但是保存其中一本Books(子模型)时出错。是否可以删除保存的父(仅在保存父和/或子时遇到错误)然后重定向到另一页?

实际上,我没有任何代码可提供。我目前正在计划如何构建代码,并且我已经想到了这个想法。

1 个答案:

答案 0 :(得分:1)

是的,您可以手动将其删除。但是有更好的方法-改用事务(如果数据库支持)。使用事务的优点很多,但是对于您的情况,这2个最相关

  1. 如果出现任何问题,您可以致电DB::rollBack(),就像从未执行过查询一样。
  2. 手动删除仍会继续执行主键/自动递增/序列号。因此,如果保存了用户(id = 4),但不幸的是,在保存该用户的书时,您会遇到错误,现在您删除了该用户。因此,下次保存另一个用户时,其ID = 5,而不是4;这会在自动增量ID中留出空隙,从技术上讲这不是问题,但看起来并不好。在交易的情况下完全避免了这个问题

这是laravel中基于事务的操作的基本结构

DB::beginTransaction(); // <-- first line  

try{
    // code ....
    // saved User
    // code ...
    // saved Book
    if($saved)
    $childModelSaved = true; 
    else
    $childModelSaved = false; 
}
catch(Exception $e)
{
     $childModelSaved = false;
}

if($childModelSaved)
{
    DB::commit(); // YES --> finalize it 
}
else
{
    DB::rollBack(); // NO --> some error has occurred undo the whole thing
}