Angenommen, ich habe a.php
, b.php
, c.php
und d.php
Migrationsklassen-Dateien. Wie kann ein Rollback auf einen bestimmten Migrationsstatus durchgeführt werden, der in b.php
definiert ist, z. B. mit einem handwerklichen Befehl?
Ich fürchte, das kannst du nicht direkt machen.
Sie haben folgende Möglichkeiten: 1, Rollback der letzten Migrationsoperation (alle im letzten Stapel durchgeführten Migrationen)
php artisan migrate:rollback
2, Alle Migrationen rückgängig machen
php artisan migrate:reset
3, Alle Migrationen rückgängig machen und erneut ausführen
php artisan migrate:refresh
php artisan migrate:refresh --seed
Ändern Sie in Ihrer Situation b.php und seine up()
-Methode, und führen Sie dann den artisan migrate:refresh
-Befehl aus.
Es gibt eine Möglichkeit, sie durch manuelles Bearbeiten der Datenbank zu hacken. Ändern Sie in der Tabelle migrations
die Spalte batch
, indem Sie der letzten Migration eine andere Chargennummer zuweisen. Beachten Sie, dass sie in aufsteigender Reihenfolge sind, und bearbeiten Sie sie entsprechend. Damit wird nachvollzogen, welche Migrationen separat angewendet wurden.
Dann artisan:rollback
ausführen und der letzte "Stapel" wird rückgängig gemacht.
Wenn Sie also alle voneinander trennen möchten, beginnen Sie von oben und geben Sie jeweils 1, 2, 3, 4, 5 usw. ein. Sie können sehen, dass es leicht skriptfähig ist möchte alle Ihre Migrationen trennen.
Durch meine Erfahrung. Ich migriere nie: Rollback. Normalerweise würde ich eine weitere Migration erstellen, die alle erforderlichen Änderungen vornimmt, um die vorherigen Migrationen rückgängig zu machen.
Auf diese Weise können Sie flexibel sein, wenn Sie 2-x-Schritte zurücksetzen möchten. Sie können einfach eine neue Migration erstellen, um die gewünschten Änderungen vorzunehmen, und dann die neue Migration nach PHP-Handwerker ausführen.
In der Tat gibt es diese Funktion (noch) nicht. überraschenderweise
Die beste Idee ist, eine neue Datei backtob.php zu erstellen und die anderen Migrationsdateien aufzurufen. Um das Kopieren und Einfügen zu vermeiden, können Sie Folgendes tun:
class BacktoB {
public function up () {
// the database is in the after D state //
$migrateD = new D();
$migrateD->down();
// the database is in the after C state //
$migrateC = new C();
$migrateC->down();
// the database is in the before C state //
// before C = B //
}
public function down () {
// the database is in the B state //
$migrateC = new C();
$migrateC->up();
// the database is in the after C state //
$migrateD = new D();
$migrateD->up();
// the database is in the after D state //
}
}
Wie Sie sehen, können Sie das Auf und Ab der Migrationen erstellen, die Sie zurücksetzen möchten.
Es ist nicht das Ideal, aber wir können es tun.
Mit Laravel 5.3 ist kein umfangreiches Scripting erforderlich. Da es erlaubt, eine bestimmte Anzahl von Migrationen rückgängig zu machen.
php artisan migrate:rollback --step=1
Hier ist das Handbuch page als Referenz.
Wenn Sie wirklich wollten - Sie könnten eine benutzerdefinierte Funktion schreiben, die die Migrationstabelle abfragt, nach der gewünschten Datei sucht und ermittelt, wie oft ein Rollback ausgeführt werden soll - dann führt eine Schleife 'Migration: Rollback' aus. bis Sie die erforderliche Migration erreichen ...
Es gibt einen einfachen, aber schmutzigen Weg:
Wenn Sie a.php
, b.php
und c.php
migrieren und c
und b
zurücksetzen möchten, können Sie a.php
einfach so ändern, dass ein Syntaxfehler auftritt.
Wenn Sie php artisan migrate:rollback
ausführen, wird sowohl c
als auch b
zurückgesetzt und mit einem Fehler in a
gestoppt. Ab diesem Zeitpunkt wird der Rollback von c
und b
als letzter Migrationsvorgang betrachtet.
Vergessen Sie nicht, den Fehler zu beheben, den Sie absichtlich in a.php
gemacht haben.
Da Laravel lediglich php artisan migrate bereitstellt: rollback, um das Migrationsskript zurückzusetzen, besteht die beste Möglichkeit zum Rollback des ausgewählten Migrationsskripts darin, ein neues Migrationsskript zu erstellen und das Skript in Ihre down-Methode (in das ausgewählte Migrationsskript) aufzunehmen. auf das neu erstellte Migrationsskript . Hoffe diese Hilfe.
Verwenden Sie den PHP-Handwerker migrate: rollback-Befehl.
php artisan migrate:rollback
Verwenden Sie die Option --pretend, um zu sehen, was das Rollback bewirkt.
php artisan migrate:rollback --pretend
Sie können auch eine andere Datenbankverbindung als die Standardverbindung angeben.
php artisan migrate:rollback --pretend --database=other-one