我有这个foreach
循环,负责在将信息保存到数据库后发送邮件。
foreach ($cart->items as $item){
$order->details()->create([
'quantity' => $item['quantity'],
'discount' => $product->discount,
'total' => $total,
]);
Mail::to($product->user->email)->send(new ProductOrdered($item, $order));
}
当邮件正常工作时,一切都很完美。无论何时邮件发送失败,只保存传递给foreach循环的第一个项目,并抛出一个错误,阻止其余代码执行。
在这种特殊情况下,有没有办法阻止在邮件发送失败时保存数据?
答案 0 :(得分:1)
您是否尝试过使用数据库事务?
您可以使用数据库外观上的事务方法在数据库事务中运行一组操作。如果在事务Closure中抛出异常,则事务将自动回滚。
https://laravel.com/docs/5.5/database#database-transactions
foreach ($cart->items as $item) {
DB::transaction(function () {
$order->details()->create([
'quantity' => $item['quantity'],
'discount' => $product->discount,
'total' => $total,
]);
Mail::to($product->user->email)->send(new ProductOrdered($item, $order));
}
}