2017-05-08 14 views
0

私は基本的なユーザー情報のユーザーモデルを持っています。そして、ユーザーとロールを関連付けるRoleモデルとRoleUserモデルを持っています。ユーザー編集フォームでは、そのユーザーに追加の役割を追加できます。だから、ここ2 DB操作は、DB ::トランザクション内で実行されているLaravel 5.3 DB:一部のクエリでもトランザクションのコミットが失敗しています

1) Update User info into User model 
2) Add role to user 

問題、それはすでに正常に更新され、「ユーザー」モデルの変更をロールバックしない失敗「ユーザーに役割を追加する」場合には、あります。ここで

は、コントローラ内の

コード - 私のサンプルです:createRoleUserのRoleUserモデルで

$response = 
DB::transaction(function() use($user_data, $input) { 
    //Update changes in basic user info using "User" Model 
    $response = User::updateUser($user_data['user']); 

    if ($response->status===FALSE) {//not updated 
     return $response; 
    } 
    if (!empty($user_data['roles'])) { 
     $roles = []; 
     foreach ($user_data['roles'] as $role) { 
      $roles[] = ['role_id' => $role, 'user_id' => $user_data['user']['id'], 'created_by' => $this->curr_user->id, 'updated_by' => $this->curr_user->id]; 
     } 
    //Add new roles to the user using "RoleUser" Model 
     $response3 = RoleUser::createRoleUser($roles); 
     if ($response3->status===FALSE) {//failed to add 
      return $response3; 
     }        
    } 

    return $response; 
}, 5); 

createRoleUser方法の//ソース

try { 
    DB::table($table)->where('id', $id)->update($changes); 
} catch (\Illuminate\Database\QueryException $qe) { 
    return (object) ['status' => FALSE, 'error' => $qe->errorInfo]; 
} catch (\Exception $e) { 
    return (object) ['status' => FALSE, 'error' => [$e->getCode(), 'non-DB', $e->getMessage()]]; 
} 
return (object) ['status' => TRUE, 'data' => $changes + ['id' => $id]]; 

//ソースRoleUserモデルのメソッド

try { 
    $new_rec_id = DB::table('role_users)->insertGetId($new_data); 
    $new_rec = FALSE; 
    if ($new_rec_id) { 
     $new_rec = DB::table($table)->where('id', $new_rec_id)->first(); 
    } 
} catch (\Illuminate\Database\QueryException $qe) { 
    return (object) ['status' => FALSE, 'error' => $qe->errorInfo]; 
} catch (\Exception $e) { 
    return (object) ['status' => FALSE, 'error' => [$e->getCode(), 'non-DB', $e->getMessage()]]; 
} 
return (object) ['status' => TRUE, 'data' => $new_rec]; 

答えて

2

トランザクションがロールバックをトリガーするには、トランザクションクロージャ内から例外をスローする必要があります。例外がスローされない場合、トランザクションはコミットします。

これは、transaction関数の呼び出しをtry/catchでラップする必要があることを意味します。ロールバックを処理するコードは、アプリケーションコードが処理するロールバック後に例外を再現するためです。

try { 
    $response = DB::transaction(function() use($user_data, $input) { 
     //Update changes in basic user info using "User" Model 
     $response = User::updateUser($user_data['user']); 

     if ($response->status===FALSE) {//not updated 
      // throw exception to trigger rollback 
      throw new \Exception($response->error); 
     } 
     if (!empty($user_data['roles'])) { 
      $roles = []; 

      foreach ($user_data['roles'] as $role) { 
       $roles[] = ['role_id' => $role, 'user_id' => $user_data['user']['id'], 'created_by' => $this->curr_user->id, 'updated_by' => $this->curr_user->id]; 
      } 

      //Add new roles to the user using "RoleUser" Model 
      $response3 = RoleUser::createRoleUser($roles); 
      if ($response3->status===FALSE) {//failed to add 
       // throw exception to trigger rollback 
       throw new \Exception($response3->error); 
      }        
     } 

     // return without exception to trigger commit 
     return $response; 
    }, 5); 
} catch (\Exception $e) { 
    echo 'uh oh: '.$e->getMessage(); 
} 
+1

おかげ@Patricusが、それは完璧に動作します:

だから、あなたのコードは次のようになります! – Sadat

関連する問題