Dites que j'ai les fichiers de classes de migration a.php
, b.php
, c.php
et d.php
. Comment revenir à un état de migration spécifique, l'état défini dans b.php
, par exemple, avec une commande artisan?
J'ai bien peur que vous ne puissiez pas le faire directement.
Vous pouvez: 1, restaurer la dernière opération de migration (toutes les migrations ont été exécutées dans le dernier lot)
php artisan migrate:rollback
2, restaurer toutes les migrations
php artisan migrate:reset
3, annuler toutes les migrations et les exécuter à nouveau
php artisan migrate:refresh
php artisan migrate:refresh --seed
Dans votre cas, modifiez b.php et sa méthode up()
, puis exécutez la commande artisan migrate:refresh
.
Il existe un moyen de le pirater en modifiant manuellement la base de données. Dans la table migrations
, modifiez la colonne batch
en attribuant à la dernière migration un numéro de lot différent. Sachez qu’ils sont dans l’ordre croissant, modifiez-les en conséquence. Cela permet de savoir quelles migrations ont été appliquées séparément.
Ensuite, lancez artisan:rollback
et cela annulera le dernier "lot".
Donc, si vous voulez les séparer tous, commencez par le haut et attribuez à chaque 1, 2, 3, 4, 5, etc. souhaite séparer toutes vos migrations.
Dans mon expérience. Je ne migre jamais: revenir en arrière. En général, je crée une autre migration qui effectue toutes les modifications nécessaires pour annuler/annuler les migrations précédentes.
De cette façon, vous pouvez faire preuve de souplesse si vous souhaitez revenir en arrière 2-x, vous pouvez simplement créer une nouvelle migration pour appliquer les modifications souhaitées, puis exécuter la nouvelle migration par php artisan migrate.
En fait, il n'y a pas cette fonctionnalité (pour le moment). étonnamment
La meilleure idée est de créer un nouveau fichier backtob.php et de l'appeler comme étant le bas de vos autres fichiers migrés. Pour éviter le copier-coller, vous pouvez faire quelque chose comme ceci:
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 //
}
}
Comme vous pouvez le constater, vous pouvez créer le haut et le bas en appelant le haut et le bas de ces migrations avec ce que vous voulez rétablir.
Ce n'est pas l'idéal, mais c'est ce que nous pouvons faire.
Avec Laravel 5.3, il n’est pas nécessaire d’utiliser un script lourd. Comme cela permet d'annuler un nombre donné de migrations.
php artisan migrate:rollback --step=1
Voici le manuel page pour référence.
Si vous vraiment le vouliez, vous pourriez écrire une fonction personnalisée qui interroge la table des migrations, recherche le fichier que vous recherchez et détermine le nombre de fois que vous souhaitez revenir en arrière, puis effectue une boucle de 'migrate: restauration' jusqu'à ce que vous atteigniez la migration requise ...
Il y a un moyen facile mais sale:
Si vous avez des migrations a.php
, b.php
et c.php
et que vous souhaitez annuler c
et b
, vous pouvez simplement modifier a.php
de manière à ce qu'il y ait une erreur de syntaxe ... supprimez un point-virgule ou autre.
Ainsi, lorsque vous exécutez php artisan migrate:rollback
, il annulera c
et b
et s’arrêtera avec une erreur dans a
. À partir de ce moment, l'annulation de c
et b
sera considérée comme la dernière opération de migration.
N'oubliez pas de réparer les erreurs que vous avez volontairement commises dans a.php
.
Puisque Laravel fournit uniquement une migration artisanale php: restauration pour restaurer votre script de migration, le meilleur moyen d'annuler le script de migration sélectionné est de créer un nouveau script de migration et de l'insérer dans votre méthode down (dans le script de migration sélectionné). au script de migration nouvellement créé . J'espère que cela vous aidera.
Utilisez la commande php artisan migrate: rollback.
php artisan migrate:rollback
Pour voir ce que la restauration fera, utilisez l'option --pretend.
php artisan migrate:rollback --pretend
Vous pouvez également spécifier une connexion à une base de données autre que celle par défaut.
php artisan migrate:rollback --pretend --database=other-one