亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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 關注
  • 132 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號