为了账号安全,请及时绑定邮箱和手机立即绑定

如果发生错误,如何避免数据插入?Laravel 中的(多次插入的方法)

如果发生错误,如何避免数据插入?Laravel 中的(多次插入的方法)

PHP
慕少森 2023-07-21 16:14:42
我正在构建一个 Web 应用程序,并且我意识到可能存在问题。我有一个控制器,其中有一个store方法。此方法在数据库中创建多个插入。public function store(LocationPostRequest $request){  $location = Location::create([...]);  $order = new Order([...]);  $location->order()->save($order);  $contact = Contact::findOrFail(id);  $order->contacts()->save($contacts);  Transaction::create([])}正如你所看到的,我有很多插入内容。如果发生错误(或者用户在某个时刻失去连接),它将破坏我的数据库的完整性,因为我的方法将添加第一个元素,但不会添加其他元素。我这样想对吗?如何避免这种情况?
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

您可以使用 laravel 数据库交易。

如果任何数据库查询失败,它将自动回滚之前的查询。

DB::transaction(function () {
    //set of queries
   //example 
   DB::table('users')->update(['votes' => 1]);
   DB::table('posts')->delete();
});


查看完整回答
反对 回复 2023-07-21
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

是的,你说得完全正确。您担心的是数据库的普遍问题。典型的例子是银行转账,即你向我汇款。需要从您的资金中减去该金额并添加到我的资金中。如果第一次操作就失败了,那就是运气不好,但至少没有人赔钱。如果它在中间某个地方失败了,在从你那里扣除钱之后,但在将钱添加到我之前,那么你将很难说服我你实际上已经发送了金额,而你已经损失了给定的金额。

您的情况类似,可能风险较小,但仍然重要的是确保在发生故障时恢复操作之前的数据库状态。这就是产生这样一种想法的原因:某些操作应该彼此形成原子绑定,并且它们应该要么一起成功,要么一起失败。这种将操作绑定在一起的操作称为事务。

交易是:

  • 阿托米克_

  • 一致_

  • 耐用_

  • 索然无味

这些共同构成了 ACID 原则,这是你在忧虑中直观发现的。Laravel 有自己的事务支持,您可以通过以下方式调用:

DB::transaction($somefunction)

你的工作是将你的函数作为参数传递给DB::transaction,不用担心,因为如果失败,Laravel 会声称会发生回滚。不过,我肯定会进行测试,因为正如温斯顿·丘吉尔所说:

无论策略多么美好,你都应该偶尔看看结果。


查看完整回答
反对 回复 2023-07-21
?
富国沪深

TA贡献1790条经验 获得超9个赞

您可以将 try 和 catch 与 DB:transaction() 一起使用。


try {

        //start the transaction

        DB::beginTransaction();


        //You code


        //commit the transaction

        DB::commit();

} catch (\Exception $e) {

        DB::rollBack();

        return response;

}

希望这可以帮助


查看完整回答
反对 回复 2023-07-21
  • 3 回答
  • 0 关注
  • 164 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号