首页 > 解决方案 > Laravel 在雄辩的保存上试运行

问题描述

保存时有什么方法可以在 Laravel 中执行空运行?

假设我有 2 个模型,Booking并且BookingDetails. 我不希望他们中的任何一个在没有另一个的情况下保存。

目前我正在填写这样的储蓄:

 // Create new booking

  try
  {
       $booking = with(new Booking)->fill(request()->all())->save();
       $bookingDetails = with(new BookingDetails)->fill(request()->all())->save();
  }
  catch (\Exception $e)
  {
       // Die quietly
  }

理想情况下,我希望能够首先检查预订保存是否有效,因为如果预订保存不起作用,我不想保存详细信息。然后如果细节无法保存,我不想首先保存预订,我只想抛出一个错误并且如果失败则什么都不保存。

有什么方法可以让我试运行并测试所有的保存工作,如果他们这样做并且一切正常,那么保存真实吗?而不是做这样的事情

 // Create new booking

  try
  {
       $booking = with(new Booking)->fill(request()->all())->save();
       try
       {
           $bookingDetails = with(new BookingDetails)->fill(request()->all())->save();
       }
       catch (\Exception $ex)
       {
            // Find the booking here and delete, because the details cant be saved
       }
  }
  catch(\Exception $e)
  {
       // Die quietly
  }

标签: phplaravellaravel-5eloquent

解决方案


数据库事务是您正在寻找的。

数据库事务只保存booking并且bookingDetails当它们都很好时。如果其中任何一个失败,则不会保存任何内容。

DB::transaction(function () {
       $booking = with(new Booking)->fill(request()->all())->save();
       $bookingDetails = with(new BookingDetails)->fill(request()->all())->save();
}, 5);

推荐阅读