Скажем, у меня есть файлы классов миграции 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 нет необходимости в тяжелых сценариях. Поскольку он позволяет откатить заданное количество миграций.
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