Php 如果在保存子模型时遇到错误,Laravel将回滚保存的更改

Php 如果在保存子模型时遇到错误,Laravel将回滚保存的更改,php,laravel,laravel-5,Php,Laravel,Laravel 5,例如,我有一个用户拥有多本书的关系 让我们以这个场景为例 我成功地保存了作为父模型的用户,但在保存作为子模型的其中一本书时出错。只有在保存父项和/或子项时遇到错误,然后重定向到其他页面时,才可以删除保存的父项吗 实际上我没有任何代码可以提供。我目前正在计划如何构建代码,我已经想到了这个想法。是的,您可以手动删除它。但是有一种更好的方法——如果数据库支持事务,则使用事务。使用事务的优点很多,但对于您的场景来说,这两个是最相关的 如果出现任何问题,您可以调用DB::rollBack,就好像查询从未运

例如,我有一个用户拥有多本书的关系

让我们以这个场景为例

我成功地保存了作为父模型的用户,但在保存作为子模型的其中一本书时出错。只有在保存父项和/或子项时遇到错误,然后重定向到其他页面时,才可以删除保存的父项吗


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

是的,您可以手动删除它。但是有一种更好的方法——如果数据库支持事务,则使用事务。使用事务的优点很多,但对于您的场景来说,这两个是最相关的

如果出现任何问题,您可以调用DB::rollBack,就好像查询从未运行过一样。 手动删除仍将对主键/自动增量/序列id进行处理。因此,如果用户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
}

我试试这个。非常感谢。