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

使用 Laravel 5.1 跨多个 Eloquent 模型进行交易

使用 Laravel 5.1 跨多个 Eloquent 模型进行交易

PHP
POPMUISE 2023-05-26 17:24:26
我想将一个父项及其所有子项插入数据库。如果任何孩子无法创建,我想中止整个交易。我试过使用以下代码片段:DB::beginTransaction();try{    // Create parent item    $one = new ModelOne();    $one->key = 'Parent Key';    $one->title = 'Parent title';    $one->save();    // Create child items    foreach ($items as $item) {        $two = new ModelTwo();        $two->parent_id = $one->id;        $two->content = $item->content;        $two->status = $item->status;        $two->save();    }    DB::commit();    return response(['message'=>'ALL GOOD'], 200);}catch (\ Illuminate\Database\QueryException $e){    DB::rollBack();    return response(['message'=>'FAILURE'], 500);}然而,当抛出异常时(比如因为一个键在孩子之间重复)ModelOne($one)被保存在数据库中,即使DB::commit()从未被调用。我错过了什么?我正在使用 Laravel 5.1。
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

原来这个问题与我在问题中提供的代码无关。

问题是我的表是使用MyISAM不支持事务创建的。

使用InnoDBinstead 使代码按预期工作。为此,请添加$table->engine = 'InnoDB';到您的迁移中。


查看完整回答
反对 回复 2023-05-26
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

我将此代码用于交易并且它有效:


DB::transaction(function () { 

});

使用此代码,您无需提交或回滚。它们被自动调用。


在您的情况下,您将拥有:


try {

    DB::transaction(function () use ($items) ({ 

        // ... your inserts

    });

catch () {}


查看完整回答
反对 回复 2023-05-26
  • 2 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信