【问题标题】:Laravel: does the migration file run one time only between migrate and rollback?Laravel:迁移文件是否只在迁移和回滚之间运行一次?
【发布时间】:2018-07-26 05:04:25
【问题描述】:

在一个 Laravel 项目中,我在创建表迁移文件中编写了以下 up() :

public function up()
{
    Schema::create('employees', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
    });
}

并运行迁移命令:

php artisan migrate

并且表创建成功,然后我创建了另一个迁移文件来修改我的表添加一个新列并编写了以下 up():

public function up()
{
    Schema::table('employees', function (Blueprint $table) {
        $table->string('name');
    });
}

正如预期的那样,该列已成功添加。

我的问题是当我修改最后一个文件以添加新列时

public function up()
{
    Schema::table('employees', function (Blueprint $table) {
        $table->string('name');
        $table->string('address');
    });
}

并运行:

php artisan migrate

该命令给了我没有要迁移的东西,所以我应该为每个修改创建一个新的迁移文件还是应该运行其中一个命令

php artisan migrate:rollback

php artisan migrate:refresh

得到我的修改?但在最后的命令中,数据会丢失,我不希望这种情况发生。

【问题讨论】:

    标签: php laravel migration


    【解决方案1】:

    这个答案有两个部分。

    只要您仍处于开发阶段:是的,您可以随时编辑您的迁移并来回滚动,直到您对结果感到满意为止。

    一旦您的迁移在其他地方(例如生产系统)执行:您永远不应再更改该迁移。这里的重点是要有一个可以重放结构变化的机制。 Laravel 使用一个非常简单的“我是否已经运行了这个迁移?” - 功能来查看它仍然需要为该数据库运行迁移的哪些部分。因此,以后再也不会运行相同的迁移。

    TL;DR:关于你的问题

    我应该为每个修改创建一个新的迁移文件

    可以说:是的!

    【讨论】:

    • 谢谢你的回答,如果这是我寻找最佳实践的唯一方法,我可以轻松地修改我的数据库并创建多个修改文件。
    【解决方案2】:

    正如 ArSen 所说,只要您仍在开发中,您就可以修改 migration 文件,例如将它们全部合并到一个文件中

    public function up()
    {
        Schema::create('employees', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('address');
            $table->timestamps();
        });
    }
    

    然后从Laravel Docs在您的终端中运行这个

    php artisan migrate:fresh

    【讨论】:

      【解决方案3】:

      在本地开发时,“迁移文件”更新是正常的。 每次更新后,您必须做第一件事或第二件事:

      run php artisan migrate:rollback --step=1 WITH OLD VERSION of migration file, after 
      that change migration file as you wish and run "php artisan migrate" again
      

      manually delete record from migrations table, and manually delete all changes that 
      migration produced (e.g. delete db table) and after that just run "php artisan migrate"
      

      【讨论】:

      • 首先感谢您的回答 :) 如果我按照您所说的在本地开发并且不担心丢失我的数据,我会使用第一选择,在第二选择中删除迁移文件是让laravel再次运行文件的好主意,但删除所有更改可能意味着删除一个表,如你所说,我认为如果其他表有例如,这可能会在其他表中出错。外键指向已删除表中的列,因此如果我重命名表,其他表将不会受到影响。
      猜你喜欢
      • 2021-07-01
      • 2018-08-01
      • 2010-11-22
      • 2015-08-28
      • 2012-08-07
      • 2014-03-01
      • 1970-01-01
      • 2017-12-24
      • 2017-03-08
      相关资源
      最近更新 更多