laravel 4 artisan – как откат к определенному состоянию миграции?

Скажем, у меня есть файлы классов миграции a.php , b.php , c.php и d.php . Как откат к определенному состоянию миграции, состояние, определенное в b.php например, с помощью команды artisan?

Боюсь, вы не можете сделать это напрямую.

Вы можете: 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 .

Есть способ взломать его, вручную отредактировав базу данных. В таблице migrations измените столбец batch , указав последнюю миграцию на другой номер партии. Имейте в виду, что они в порядке возрастания, поэтому отредактируйте соответственно. Это отслеживает, какие миграции были применены отдельно.

Затем запустите artisan:rollback и он отменит последнюю «партию».

Поэтому, если вы хотите разделить их все, то начинайте с вершины и дайте каждому 1,2,3,4,5 и так далее … Вы можете видеть, что он легко доступен для сценариев, и вы можете сделать команду artisan, если вы хотите отделить все свои миграции.

По моему опыту. Я никогда не переношу: откат. Обычно я создаю другую миграцию, которая выполняет все изменения, которые мне нужно «отменить / откат» предыдущих миграций.

Таким образом, вы можете быть гибким, если хотите отменить 2-х шагов назад, вы можете просто создать новую миграцию для выполнения необходимых изменений, а затем запустить новую миграцию с помощью миграции php-artisan.

На самом деле, эта функция еще не существует. как ни странно

Лучшая идея – создать новый файл 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 // } } 

Как вы можете видеть, вы можете создать вверх и вниз, вызывая вверх и вниз эти миграции, что вы хотите вернуть.

Это не идеал, но это то, что мы можем сделать.

Если бы вы действительно захотели – вы могли бы написать пользовательскую функцию, которая запрашивает таблицу миграции, ищет файл, который вы используете, и выдает, сколько раз откатывается, а затем цикл «migrate: rollback», пока вы не достигнете требуемая миграция …

Laravel 5.3

С Laravel 5.3 нет необходимости в тяжелых сценариях. Поскольку он позволяет откатить заданное количество миграций.

 php artisan migrate:rollback --step=1 

Вот справочная страница для справки.

Существует легкий, но грязный способ:

Если у вас есть миграции a.php , b.php и c.php и вы хотите откат c и b , вы можете просто изменить a.php таким образом, чтобы произошла синтаксическая ошибка … отбросьте a.php или что нибудь.

Итак, когда вы запустите php artisan migrate:rollback он откатит оба c и b и остановится с ошибкой в a . С этого момента откат c и b будет считаться последней миграционной операцией.

Не забудьте исправить любую ошибку, которую вы сделали специально в a.php .

Поскольку Laravel просто обеспечивает миграцию php-artisan: rollback для отката вашего сценария миграции, лучший способ отменить выбранный сценарий миграции – создать новый сценарий миграции и поместить скрипт в ваш метод down (по выбранному сценарию миграции) на вновь созданный сценарий миграции. Надеюсь, эта помощь.

Используйте команду mpp artisan migrate: rollback.

 php artisan migrate:rollback 

Чтобы узнать, какой откат будет выполнен, используйте параметр –pretend.

 php artisan migrate:rollback --pretend 

Вы также можете указать соединение с базой данных, отличное от стандартного.

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