Laravel:迁移文件仅在迁移和回滚之间运行一次吗?

时间:2018-07-21 13:47:59

标签: php laravel migration

在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

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

3 个答案:

答案 0 :(得分:1)

此答案分为两部分。

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

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

TL; DR:您的问题

  

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

一个人可以说:是的!

答案 1 :(得分:0)

正如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

答案 2 :(得分:0)

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

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"