Laravel 迁移:重命名和添加具有相似名称的列以错误结束

Laravel Migration: Rename and Add column with similar name ends up with error

我们正在使用 Laravel 迁移 (v8.x) 来更改我们现有的 table 之一,我们希望将列重命名为现有列,但在此之前,我们放弃了它。在 up() 上它工作得很好。但是在 down() 上,它不能先重命名列,然后再添加列。以下代码是我们所做的精简版:

public function up()
{
    Schema::table('extensions', function (Blueprint $table) {
        $table->dropColumn('extended_amount'); // Runs 1st.
        $table->renameColumn('extended_amount_final', 'extended_amount'); // Runs 2nd.
    });
}

public function down()
{
    Schema::table('extensions', function (Blueprint $table) {
        $table->renameColumn('extended_amount', 'extended_amount_final'); // Not running 1st.
        $table->decimal('extended_amount', 22, 2)->nullable(); // Error with 'duplicate column'.
    });
}

down() 上的重命名命令在开始执行第二行时不知为何没有执行完。

但是,我们尝试使用原始 MySQL 查询,例如:

ALTER TABLE extensions
CHANGE extended_amount extended_amount_final DECIMAL(22,2),
ADD COLUMN extended_amount DECIMAL(22,2) NOT NULL;

它工作得很好。所以我们得出结论,这是 Laravel 迁移中的错误。

但是我们如何使用 Laravel 迁移以所需的方式更改 table,因为我们在其中有数据并且我们不想删除该列?

如您所料,问题可能出在 Laravel 迁移中。但是您仍然可以使用 Laravel 迁移来更改 table,只需将执行分开,因为它们不是您期望的 运行。我们只修改 down() 方法,因为问题实际所在。

方法一

public function down()
{
    Schema::table('extensions', function (Blueprint $table) {
        $table->renameColumn('extended_amount', 'extended_amount_final');
    });
    Schema::table('extensions', function (Blueprint $table) {
        $table->decimal('extended_amount', 22, 2)->nullable();
    });
}

方法二

您可以使用 DB Facade 通过原始 SQL 在单独的查询中执行此操作。

use Illuminate\Support\Facades\DB;

public function down()
{
    Schema::table('extensions', function (Blueprint $table) {
        $table->renameColumn('extended_amount', 'extended_amount_final');
        // $table->decimal('extended_amount', 22, 2)->nullable();
    });
    DB::statement("ALTER TABLE project_extensions ADD COLUMN extended_amount DECIMAL(22,2) NOT NULL;
}

感谢我的同事 Ms. Mowshana Farhana 和 Mr. Nazmul Hasan,感谢他们协助调试问题并找出解决方案。