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

我想将一个父项及其所有子项插入数据库。如果任何孩子无法创建,我想中止整个交易。


我试过使用以下代码片段:


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。


POPMUISE
浏览 107回答 2
2回答

汪汪一只猫

原来这个问题与我在问题中提供的代码无关。问题是我的表是使用MyISAM不支持事务创建的。使用InnoDBinstead 使代码按预期工作。为此,请添加$table->engine = 'InnoDB';到您的迁移中。

翻过高山走不出你

我将此代码用于交易并且它有效:DB::transaction(function () { });使用此代码,您无需提交或回滚。它们被自动调用。在您的情况下,您将拥有:try {    DB::transaction(function () use ($items) ({         // ... your inserts    });catch () {}
打开App,查看更多内容
随时随地看视频慕课网APP