web-dev-qa-db-ja.com

laravel 4 artisan-特定の移行状態にロールバックする方法?

a.phpb.phpc.php、およびd.phpの移行クラスファイルを取得したとします。特定の移行状態(たとえば、artisanコマンドでb.php内で定義された状態)にロールバックする方法は?

23
do.

恐れていますが、これを直接行うことはできません。

1、最後の移行操作をロールバック(すべての移行は最後のバッチで実行されました)

_php artisan migrate:rollback
_

2、すべての移行をロールバックする

_php artisan migrate:reset
_

3、すべての移行をロールバックし、すべてを再度実行します

_php artisan migrate:refresh  
php artisan migrate:refresh --seed
_

状況に応じて、b.phpとup()メソッドを変更してから、_artisan migrate:refresh_コマンドを実行します。

37
Andreyco

データベースを手動で編集して、ハッキングする方法があります。 migrationsテーブルで、最後の移行に異なるバッチ番号を与えることにより、batch列を変更します。それらは昇順であることに注意してくださいので、それに応じて編集してください。これは、どの移行が個別に適用されたかを追跡します。

次にartisan:rollbackを実行すると、最後の「バッチ」が取り消されます。

すべてを分離したい場合は、上から始めて、それぞれ1、2、3、4、5などを指定します。簡単にスクリプト化できることがわかります。すべての移行を分離したい。

28
Paul Cristea

私の経験では。私は決して移行しない:ロールバック。私は通常、以前の移行を「元に戻す/ロールバック」するために必要なすべての変更を行う別の移行を作成します。

この方法により、2倍のステップをロールバックする場合に柔軟になり、必要な変更を有効にする新しい移行を作成してから、php artisan migrateで新しい移行を実行できます。

5

実際、この機能はまだありません。驚いたことに

最善のアイデアは、新しいファイルbacktob.phpを作成し、他の移行ファイルのダウンコールを作成することです。コピーアンドペーストを避けるために、次のようなことができます。

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 //
  }
}

ご覧のとおり、元に戻すことを望むものを、それらのマイグレーションの上下を呼び出す上下を作成することができます。

それは理想ではありませんが、私たちにできることです。

3
Thiago Mata

ララヴェル5.3

Laravel 5.3では、重いスクリプトを作成する必要はありません。指定された数の移行をロールバックできるためです。

php artisan migrate:rollback --step=1

参照用のマニュアル page があります。

3

reallyが必要な場合-移行テーブルにクエリを実行し、必要なファイルを検索し、ロールバックする回数を計算するカスタム関数を作成できます-その後、「migrate」のループを実行します:rollback '必要な移行に達するまで...

2
Laurence

簡単でありながら汚い方法があります:

a.phpb.php、およびc.phpの移行があり、cおよびbをロールバックする場合は、a.phpを変更するだけです。構文エラーが発生する方法...セミコロンまたは何かをドロップします。

したがって、php artisan migrate:rollbackを実行すると、cbの両方がロールバックされ、aでエラーが発生して停止します。それ以降、cbのロールバックは最後の移行操作と見なされます。

a.phpで意図的に作成したエラーを修正することを忘れないでください。

1
mper

Laravelはphp artisan migrate:rollbackを提供して移行スクリプトをロールバックするだけなので、選択した移行スクリプトをロールバックする最良の方法は、新しい移行スクリプトを作成し、スクリプトをdownメソッド(on選択した移行スクリプト)を新しく作成した移行スクリプトに追加します。

0
qatz

Php artisan migrate:rollbackコマンドを使用します。

php artisan migrate:rollback

ロールバックの動作を確認するには、-pretendオプションを使用します。

php artisan migrate:rollback --pretend

デフォルト以外のデータベース接続を指定することもできます。

php artisan migrate:rollback --pretend --database=other-one
0
HeadAndTail