2017-06-16 1 views
-1

Ich habe eine Tabelle mit Spalten, eine davon ist id.Laravel-Transaktionen zum Tauschen von Zeilen

+-------+     +-------+ 
| id |     | id | 
+-------+     +-------+ 
|  1 |   \ |  5 | 
|  2 | --------- \ |  3 | 
|  3 | ---------/ |  2 | 
|  4 |   / |  1 | 
|  5 |     |  4 | 
|  6 |     |  6 | 
+-------+     +-------+ 

Ich mag id Werte von Zeile so tauschen, dass, wenn eine des Schrittes es nicht müssen Rollback, und id wird derzeit als einzigartiger Zwang gesetzt. Wie verwendet man Transaktionen in Laravel, um diese id Werte zu tauschen? Ich bin neu in diesem Bereich.

Antwort

1

Sie starten, indem Sie Ihre Datenbank-Operationen in einer Transaktion Schließung Einwickeln, etwa so:

DB::transaction(function() { 
    DB::table('users')->update(['name' => 'Billy Bob']); 

    DB::table('posts')->delete(); 
}); 

Sie werden in Schwierigkeiten geraten, obwohl mit doppelten Kollisionen, wenn das Primärschlüsselfeld ID-Einstellung, wenn die Spalte, die Sie tauschen mit enthält alle übereinstimmenden Werte in der aktuellen ID-Spalte.

Sie können besser eine neue temporäre Tabelle mit den IDs aus der gewünschten Spalte erstellen, sie mit den restlichen vorhandenen Tabellendaten füllen, diese Tabelle löschen und dann mit Ihrer temporären Tabelle neu erstellen.

Sind auch andere Tabellen mit Verweisen auf diese Tabelle? Das Ändern von Schlüsseln könnte in diesem Fall Verwüstungen verursachen.

+0

Ich denke, es ist nicht effizient, eine andere temporäre Tabelle zu erstellen. Gibt es eine Möglichkeit, unique zu entfernen, ohne Schema fascade zu verwenden und dann eine eindeutige Zurück hinzuzufügen? – NaMo

+0

Es ist möglich, ALTER TABLE Tabellenname DROP PRIMARY KEY'. Wie oft machst du das, was dich ohnehin mit Effizienz beschäftigt? – btl

+0

ah vergaß die rohen Abfragen :) Ich werde das versuchen. In Bezug auf Effizienz: Es kann eine große Anzahl von Reihen geben. – NaMo

0

Sie trasaction machen kann dies unter Verwendung

DB::transaction(function() { 
     // your code goes here 
}); 

Alles innerhalb der Closure executes within a transaction. Wenn etwas falsch ist, wird es automatisch zurückgesetzt.