2017-11-28 1 views
1

Zuerst mein Motor aus innoDB ist, und ich habe bereits versucht, die folgenden auf mySQL:Laravel DB :: Rollback() nicht für die Transaktion Arbeitsprozesse

BEGIN; 
INSERT INTO `tbl_users`(...) VALUES (...) 
ROLLBACK(); 

Und es funktioniert gut, was bedeutet, das Problem war nicht in meiner Mysql-Konfiguration.

Aber wenn ich diese auf meinem Laravel Modell versucht:

public static function addNew($request, $department_id) { 

    $result = array(); 

    $now = Carbon::now(); 

    DB::beginTransaction(); 

    //Checking for existing Order to set appropriate starting ID 
    $result = DB::select(" 
     SELECT COUNT(`id`) AS 'count' 
     FROM `tbl_consignmentorders` 
    ")[0]; 

    if($result->count == 0){ 
     DB::update("ALTER TABLE `tbl_consignmentorders` AUTO_INCREMENT = 70000000001;"); 
    } 

    try { 
     //INSERT 
     DB::insert(" 
      INSERT INTO `tbl_consignmentorders` 
      (`from`, `to`, `status`, `created_at`, `updated_at`) 
      VALUES 
      (?, ?, ?, ?, ?)", 
      [ 
       $department_id, 
       strtoupper($request->input('supplier')), 
       'PENDING', 
       $now, 
       $now 
      ] 
     ); 
     //GET THE LAST ID INSERTED, NEEDED FOR NEXT INSERT 
     $last_id = DB::select(" 
      SELECT 
       LAST_INSERT_ID() AS 'id' 
      FROM `tbl_consignmentorders`;" 
     )[0]->id; 

     //CONSTRUCTING QUERY STRING FOR VALUES 
     $values = ''; 
     $count = 0; 
     foreach($request->input('item_id') as $item) { 
      $values .= ',(' . $request->input('quantity')[$count] . ', ' . $last_id . ', ' . $item . ', ' . $request->input('item_price_id')[$count] . ')'; 
      $count++; 
     } 
     $values[0] = ' '; 

     //INSERT TO DETAILS 
     DB::insert(" 
      INSERT INTO `tbl_consignmentorderdetails` 
      (`quantity`, `order_id`, `item_id`, `item_price_id`) 
      VALUES 
      $values;" 
     ); 

     //INSERT TO TRANSACTION AUDIT 
     DB::insert(" 
      INSERT INTO `tbl_transactions` 
      (`type`, `reference_id`, `department_id`, `created_at`, `updated_at`) 
      VALUES 
      (?, ?, ?, ?, ?)", 
      [ 
       'CONSIGNMENT ORDER', 
       $last_id, 
       $department_id, 
       $now, 
       $now 
      ] 
     ); 

     //COMMIT NOTHING FAILS 
     DB::commit(); 
     $result = true; 

    } catch (\Exception $e) { 
     //ROLLBACK SOMETHING IS WRONG 
     DB::rollback(); 
     $result = $e->getMessage(); 
    } 

    return $result; 
} 

nun der obige Code funktioniert gut, wenn erfolgreich, jetzt Fehler zu erzeugen, werde ich bewusst diesen Teil des Codes ändern:

//GET THE LAST ID INSERTED, NEEDED FOR NEXT INSERT 
    $last_id = DB::select(" 
     SELECT 
      LAST_INSERT_ID() AS 'id' 
     FROM `tbl_consignmentorders`;" 
    )[0]; //<--- I removed the ->id to return the whole object causing object to string error on the next query 

Nun geht es wie erwartet an den catch-Block, um die Fehlermeldung zu übergeben, aber die Abfragen, die vor dem Fehler ausgeführt wurden, sind immer noch in der Datenbank vorhanden, wo dies nicht der Fall sein sollte.

Antwort

0

Mein Fehler,

Ich benutze DB::rollback(); statt DB::rollBack(); mit Kapital B

Verwandte Themen