首页 > 解决方案 > Laravel:迁移文件是否只在迁移和回滚之间运行一次?

问题描述

在 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

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

标签: phplaravelmigration

解决方案


这个答案有两个部分。

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

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

TL;DR:对于你的问题

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

可以说:是的!


推荐阅读