Как запустить ремесленную миграцию Laravel шаг за шагом?

Я уже читал Выполнение одной конкретной миграции laravel 4 (один файл) но это не дает мне ответа.

Я хочу знать, есть ли способ запустить команду, чтобы она просто выполняла следующую и только эту миграцию.

У меня есть 10 файлов в папке Migrate-Folder. 7 из них уже перенесены. Теперь я обнаружил, что пока я создавал 3 новых и запускал команду, все они выполнялись.

Проблема в том, что в базе "выбрать * из миграций" они отображаются одним пакетом, а не отдельными. Это означает, что если я просто хочу откатиться на один шаг, мы возвращаемся к шагу 7, а не к 9 — как я и хочу.

Иногда это сбивает с толку, так как я хочу откатывать по одному шагу за раз, а не откатывать все шаги одной партии.

Я знаю, что могу переместить файлы в другую папку и просто оставить одну для запуска миграции. Затем переместите следующий и снова выполните миграцию, но это очень неудобно - что произойдет, если я случайно перенесу и перенесу шаг 10 перед шагом 9.

Кто-нибудь знает ответ на этот вопрос?


person hogan    schedule 12.06.2015    source источник
comment
Здесь есть некоторая информация: stackoverflow.com/questions/19102197/ Краткая версия заключается в том, что миграции не были созданы для этой цели.   -  person Joel Hinz    schedule 12.06.2015
comment
Это точно такая же ссылка из моего вопроса.   -  person hogan    schedule 12.06.2015
comment
Я приношу извинения. Я прочитал это слишком коряво.   -  person Joel Hinz    schedule 12.06.2015


Ответы (3)


В laravel 5.4 вы можете: php artisan migrate --step

Когда вы выполняете команду, подобную этой, вы можете впоследствии откатить каждую миграцию по отдельности, используя по умолчанию «php artisan migrate: rollback», не указывая, сколько шагов для отката.

person Rob Derks    schedule 27.05.2017
comment
Это как-то полезно, но я сомневаюсь, что это действительно отвечает на вопрос. При выполнении команды переносятся все миграции, но по одной, а не в виде пакета. Но вопрос, казалось, спрашивал, как запустить только один файл миграции и просто остановиться на нем (оставив другие неперенесенными) - person gthuo; 16.04.2018

Немного хитрости, но вы можете запустить artisan migrate для запуска всех миграций, а затем следующие команды SQL, чтобы создать впечатление, что миграции выполняются по одной:

SET @a = 0;  
UPDATE migrations SET batch = @a:=@a+1;

Это изменит столбец batch на 1, 2, 3, 4 и т. д. Добавьте туда условие WHERE batch>=... (и обновите начальное значение @a), чтобы оно затрагивало только определенные миграции.

Затем вы можете artisan migrate:rollback столько, сколько требуется.

person Colin    schedule 24.08.2015
comment
слишком много хлопот, так как копирование одного файла за другим в папку происходит быстрее, я использую этот. - person hogan; 25.08.2015
comment
Ну а сколько хлопот... решать вам. Выполнение двух команд SQL кажется быстрее, чем копирование файлов вручную. В любом случае, я бы скромно предположил, что SQL - лучший способ сделать это с точки зрения фактического решения проблемы (и, конечно, не заслуживает отрицательного голоса). - person Colin; 27.08.2015
comment
Не было моим отрицательным голосом. Я скорее хотел знать, есть ли опция команды. Не волнуйтесь больше, вопрос решен. - person hogan; 29.08.2015
comment
С laravel 5.3 вы сможете сделать это: php artisan migrate:rollback --step=2 (укажите, сколько шагов будет откатываться) - person Arda; 07.06.2016
comment
@Арда: Ага. Кажется, я сделал первоначальный PR, чтобы добавить --step в ядро. :) - person Colin; 08.06.2016
comment
@Colin А, отлично, не знал об этом, спасибо, чувак! Это будет спасением жизни! - person Arda; 08.06.2016

Проблема в том, что в базе "выбрать * из миграций" они отображаются одним пакетом, а не отдельными. Это означает, что если я просто хочу откатиться на один шаг, мы возвращаемся к шагу 7, а не к 9 — как я и хочу.

Это не очень идеально, но после их запуска вы можете настроить значения batch для каждой миграции в таблице базы данных, чтобы они были отдельными числами. php artisan migrate:rollback берет пакетное значение MAX() и откатывает все свои миграции.

person ceejayoz    schedule 12.06.2015