Как выполнить миграцию laravel только тогда, когда все процедуры верны? [Дубликат]

У Джоша G был ключ, который фиксировал этот код: use RegisterName ().

Три преимущества здесь:

  1. Не использует переменную-член для сохранения ссылки к динамически созданному TextBox.
  2. Компиляция.
  3. Полный код.
    using System;
    using System.Windows;
    using System.Windows.Controls;
    
    namespace AddControlsDynamically
    {
        public partial class Window1 : Window
        {
            public void Window_Loaded(object sender, RoutedEventArgs e)
            {
                GenerateControls();
            }
            public void GenerateControls()
            {
                Button btnClickMe = new Button();
                btnClickMe.Content = "Click Me";
                btnClickMe.Name = "btnClickMe";
                btnClickMe.Click += new RoutedEventHandler(this.CallMeClick);
                someStackPanel.Children.Add(btnClickMe);
                TextBox txtNumber = new TextBox();
                txtNumber.Name = "txtNumber";
                txtNumber.Text = "1776";
                someStackPanel.Children.Add(txtNumber);
                someStackPanel.RegisterName(txtNumber.Name, txtNumber);
            }
            protected void CallMeClick(object sender, RoutedEventArgs e)
            {
                TextBox txtNumber = (TextBox) this.someStackPanel.FindName("txtNumber");
                string message = string.Format("The number is {0}", txtNumber.Text);
                MessageBox.Show(message);
            }
        }
    }
    
101
задан kyo 17 May 2015 в 15:04
поделиться

10 ответов

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

Если вы хотите только отменить последнюю миграцию, просто увеличьте номер партии на единицу. Затем в следующий раз, когда вы запустите команду rollback, она будет откатывать только одну миграцию, поскольку она находится в «пакетной» версии.

66
ответ дан Martin Bean 15 August 2018 в 22:04
поделиться
  • 1
    Хорошая рекомендация! Я попытался отредактировать номер партии, это не позволит мне. Это своего рода замок и серый. Я пробовал это в MySQL WorkBench на моем Mac. Есть идеи по этому поводу? – kyo 17 May 2015 в 14:46
  • 2
    Знаете ли вы, почему мой номер партии заблокирован, когда я пытался их настроить? – kyo 18 May 2015 в 14:00
  • 3
    Обновить номер партии в таблице миграций по запросу: UPDATE migrations SET batch = 2 WHERE migration = 'name_of_the_migration'; – Imran Khan 16 October 2015 в 05:03
  • 4
    @ImranKhan Жестко-кодирование номера партии до «2» не особенно велико, если у вас более двух партий. – Martin Bean 2 April 2016 в 23:51
  • 5
    Используйте Sequel Pro (только для Mac OS), чтобы легко редактировать таблицу Migrations и изменять номера партий. – Arslan Ramay 1 December 2017 в 20:40

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

Перед созданием ваших миграций создайте разные каталоги:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

Затем при создании ваших миграций выполните следующую команду (используя ваши таблицы в качестве примера):

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_1

или

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_2

или

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_3

Приведенные выше команды сделают файл миграции в заданном путь к каталогу. Затем вы можете просто выполнить следующую команду для переноса файлов через назначенные им каталоги.

    php artisan migrate alter_table_web_directories --path=database/migrations/batch_1

* Примечание. Вы можете изменить batch_1 на batch_2 или batch_3 или на любое другое имя папки, в которой вы храните файлы миграции в До тех пор, пока он остается в каталоге базы данных / миграции или в каком-то определенном каталоге.

Далее, если вам нужно отменить свои конкретные миграции, вы можете откатить пакетными партиями, как показано ниже:

    php artisan migrate:rollback --step=1
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_1

или

    php artisan migrate:rollback --step=2
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_2

или

    php artisan migrate:rollback --step=3
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_3

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

6
ответ дан Andre F. 15 August 2018 в 22:04
поделиться
  • 1
    Если документация laravel не является правильной, «- step = 3» означает, что он откатит последние 3 миграции, not от 3-го до последнего запуска миграции. Я не знаю, изменило бы ли это перенос в разных папках, но я бы этого не ожидал. Если указывать откат по имени, это будет здорово! Однако, если вы даете откаты какие-либо аргументы, он жалуется на «слишком много аргументов». – Skeets 7 September 2016 в 23:17

Laravel 5.3 +

Откат одного шага. Исходно

php artisan migrate:rollback --step=1

И вот страница руководства: docs .


Laravel 5.2 и до

Ни в коем случае без каких-либо хлопот. Подробнее см. Ответ от Martin Bean .

109
ответ дан Community 15 August 2018 в 22:04
поделиться
  • 1
    Не полезно, если OP не писал свое приложение с версией Laravel в разработке. – Martin Bean 26 June 2016 в 11:53
  • 2
    Это была бы хорошая функция, но в ней отсутствуют функции, указывающие , которые для перенастройки миграции. Я предполагаю, что это просто последний, указанный в таблице миграции? Когда я переношу вещи, я обычно не планирую планировать при откате, поэтому шансы на перенос, которые я хочу вернуть назад, являются последней миграцией, не очень велики. Кажется, что ларавелл отбросил мяч на этом. Единственный безопасный способ отката одной миграции - это вручную изменить таблицу миграции. – Skeets 7 September 2016 в 22:58
  • 3
    @ SkeetsO'Reilly Согласен, миграция не очень хорошо продуман. Но они здесь, поэтому с самого начала вам не придется искать миграционный пакет. – Yauheni Prakopchyk 8 September 2016 в 16:25
INSERT INTO homestead.bb_migrations (`migration`, `batch`)  VALUES ('2016_01_21_064436_create_victory_point_balance_table', '2')

что-то вроде этого

1
ответ дан Harry Bosh 15 August 2018 в 22:04
поделиться

Каждый раз, когда вы откатываете, вы получаете последнюю партию миграции. используйте команду

php artisan migrate:rollback --step=1
6
ответ дан mu 無 15 August 2018 в 22:04
поделиться

Если вы не можете сделать то, что сказал @Martin Bean, тогда вы можете попробовать другой трюк.

Создайте новую миграцию и в этом файле в методе up () вставьте то, что находится в методе down () миграции, которую вы хотите отменить, и в методе down () вставьте метод, который находится в up ().

, например, если ваша первоначальная миграция похожа на это

public function up()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id')->unsigned();
        $table->string('name');
    });
}
public function down()
{
    Schema::drop('users');
}

, то в новом файле миграции сделайте это

public function up()
{
    Schema::drop('users');
}
public function down()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id')->unsigned();
        $table->string('name');
    });
}

, а затем запустите миграцию, она удалит Таблица. и если вы снова захотите вернуть его обратно.

15
ответ дан Nehal Hasnayeen 15 August 2018 в 22:04
поделиться
  • 1
    Спасибо за ваш ответ, но я все настроен на это. Быстрый вопрос для вас, знаете ли вы, почему я не могу редактировать столбец столбцов моей таблицы миграции? – kyo 18 May 2015 в 14:01
  • 2
    вы пытались запустить sql-запрос? – Nehal Hasnayeen 18 May 2015 в 14:22
  • 3
    @ihue немного поздно, но причина, по которой вы не можете редактировать его с помощью пользовательского интерфейса, заключается в том, что в миграциях таблиц нет первичного ключа. Вы должны написать sql, чтобы отредактировать его самостоятельно. – Vic 8 September 2016 в 17:13

Откат одного шага. Натурально.

php artisan migrate:rollback --step=1

Откат двух шагов. Натурально.

php artisan migrate:rollback --step=2
1
ответ дан parth kharecha 15 August 2018 в 22:04
поделиться

Поскольку указано в руководстве Laravel , вы можете откатить определенное количество миграций, используя опцию --step

php artisan migrate:rollback --step=5
0
ответ дан Paul Roub 15 August 2018 в 22:04
поделиться
  • 1
    только Laravel 5.3, поэтому все, что закодировано ниже этой версии, не может его использовать – Jeffz 27 August 2016 в 21:29
  • 2
    Это не помогло бы в случае OP, так как оно откатит определенное количество миграций, а не одну указанную миграцию. & Quot; - step3 & Quot; все равно будет откатывать все 3 миграции. – Skeets 7 September 2016 в 23:19

Использовать команду «php artisan migrate: rollback --step = 1» для перехода к откату на 1 шаг назад.

Для получения дополнительной информации проверьте ссылку: - https://laravel.com / Docs / мастер / миграция # обкатка миграция

0
ответ дан Shah-Kodes 15 August 2018 в 22:04
поделиться

Миграция таблиц одна за другой.

Измените номер партии перехода, который вы хотите откат, на самый высокий.

Запустите миграцию: откат.

Не может быть самым удобным способом решения крупных проектов.

3
ответ дан Skeets 15 August 2018 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: