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
}
我试试这个。非常感谢。