web-dev-qa-db-fra.com

laravel 4 artisan - comment revenir à un état de migration spécifique?

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?

23
do.

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.

37
Andreyco

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.

28
Paul Cristea

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.

5
junjet trasmonte

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.

3
Thiago Mata

Laravel 5.3

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.

3
Yauheni Prakopchyk

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 ...

2
Laurence

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.

1
mper

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.

0
qatz

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
0
HeadAndTail