如何使用Laravel迁移重命名列?

145

我有以下列:

public function up()
{
    Schema::create('stnk', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('no_reg', 50)->unique();
        $table->string('no_bpkb', 50)->unique();
        $table->string('nama_pemilik', 100);
        $table->string('alamat');
        $table->string('merk', 50);
        $table->string('tipe', 50);
        $table->string('jenis', 50);
        $table->smallInteger('tahun_pembuatan');
        $table->smallInteger('tahun_registrasi');
        $table->smallInteger('isi_silinder');
        $table->string('no_rangka', 50);
        $table->string('no_mesin', 50);
        $table->string('warna', 50);
        $table->string('bahan_bakar', 50);
        $table->string('warna_tnkb', 50);
        $table->string('kode_lokasi', 50);
        $table->date('berlaku_sampai');
        $table->timestamps();

        $table->index('created_at');
        $table->index('updated_at');
    });

}

我已经创建了一个用于 stnk 表的数据填充器(seeder)。

现在我想将 id 重命名为 id_stnk
我在 "composer" 中添加了 "doctrine/dbal" 并运行了 composer update

我创建了迁移 php artisan migration:make rename_column
然后我添加了一个新方法到 rename_column:

Schema::table('stnk', function(Blueprint $table)
{
    $table->renameColumn('id', 'id_stnk');

});

接着我尝试运行命令php artisan migrate,但是我得到了下面提到的错误:

[Ulluminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1025 Error on rename of './my_database/#sql -447_33' to './my_database/stnk' (error: 150) (SQL: ALTER TABLE stnk CHANGE id id_stnk INT UNSIGENED AUTO_INCREMENT NOT NULL)

[PDOException]
SQLSTATE[HY000]: General error: 1025  Error on rename  of './my_database/#sql -447_33' to './my_database/stnk' (error: 150)
11个回答

188

你需要创建另一个迁移文件 - 并将其放在那里:

运行

Laravel 4:    php artisan migrate:make rename_stnk_column
Laravel 5+:    php artisan make:migration rename_stnk_column

然后在新的迁移文件中放置:

class RenameStnkColumn extends Migration
{

    public function up()
    {
        Schema::table('stnk', function(Blueprint $table) {
            $table->renameColumn('id', 'id_stnk');
        });
    }


    public function down()
    {
        Schema::table('stnk', function(Blueprint $table) {
            $table->renameColumn('id_stnk', 'id');
        });
    }

}

我已经在上面编辑了我的问题,请现在查看。我在GitBash中收到了错误消息。 - Ariasa
错误150是外键约束。这意味着您有其他表引用了“stnk”表上的“id”。 - Laurence
3
请注意,对于Laravel 5,现在是使用make:migration而不是migrate:make - Jason
11
要进行列重命名,您需要要求一个在L5中被删除的软件包"doctrine/dbal": "~2.3"。如果没有这个软件包,您将会遇到一些非常晦涩的错误。有人在这里提出了一个bug https://github.com/laravel/framework/issues/3116,并在文档中以较不实用的方式提到了这一点 http://laravel.com/docs/5.0/schema#renaming-columns - Jason
迁移完成后,应该删除文件并更新原始创建模式吗?只是想知道如何保持清洁。 - orbitory

53

请按照以下步骤逐一重命名列迁移文件。

1- 检查您的项目中是否有Doctrine/dbal库。如果没有,请先运行命令。

composer require doctrine/dbal

第二步- 为更新旧迁移文件创建更新迁移文件。 警告(需要具有相同的名称)

php artisan make:migration update_oldFileName_table

例如,我的旧迁移文件名称为:create_users_table 更新后的文件名应该是:update_users_table

3- update_oldNameFile_table.php

Schema::table('users', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});

'from' 是我的旧列名,'to' 是我的新列名

4- 最后运行迁移命令

php artisan migrate

来源链接:Laravel文档

注意:此功能支持从laravel 5.x到8.x版本。

更新: 在9版本之后,这个过程变得更加简单了 你需要做的就是使用“Schema”外观的“rename”静态方法。

use Illuminate\Support\Facades\Schema;
 
Schema::rename($from, $to);

来源链接:Laravel文档-9.x


是的,这些步骤是正确的,您可以在安装包后更改字段的名称。 - İbrahim

43

首先需要做的是创建迁移文件。

在命令行中输入以下命令:

php artisan make:migration rename_stk_column --table="YOUR TABLE" --create

创建完文件后,在应用程序文件夹的 database/migrations 下打开新创建的迁移文件。

在 up 方法中插入以下内容:

Schema::table('stnk', function(Blueprint $table)
    {
        $table->renameColumn('id', 'id_stnk');
    });
}

在 `down` 方法中:

    Schema::table('stnk', function(Blueprint $table)
    {
        $table->renameColumn('id_stnk', 'id);
    });
}

然后在您的命令行中只需键入

php artisan migrate

然后,瞧!你刚刚将id重命名为id_stnk。 顺便说一句,你可以使用

php artisan migrate:rollback

撤销更改。祝好运。


我已经在上面编辑了我的问题,请现在查看。我在GitBash中收到了错误消息。 - Ariasa
1
请确保将doctrine/dbal依赖项添加到您的composer.json文件中。 - Ben

21

重命名列 (Laravel 5.x)

要重命名一个列,可以在模式生成器上使用 renameColumn 方法。在重命名列之前,请务必将doctrine/dbal 依赖项添加到您的 composer.json 文件中。

或者,您可以使用Composer直接安装该软件包...

composer require doctrine/dbal

来源:https://laravel.com/docs/5.0/schema#renaming-columns

注意:对于 Laravel 5.x,请使用 make:migration 而不是 migrate:make

从 Laravel 9 开始重命名数据库列时,无需再依赖 Doctrine #45258


不要在你尝试编辑的表中使用任何列作为ENUM。Doctrine/dbal不知道这是什么.....我不得不更改原始迁移以正确命名并重置整个数据库。幸运的是,我还在开发阶段。我认为Laravel和其他框架应该从一开始就将其作为composer的依赖项。 - mikoop
@mikoop 最初它是框架早期版本的一个依赖项。但是这个依赖项太重了,而且不常用。因此已经被移除。(这是摘要;在做出决定之前进行了很多讨论。事实上,社区要求将其移除,并得到了回应。) - J. Bruni
renameColumn在doctrine中已经被弃用,并且当前已被移除。 - Sander Visser

15

因为没有一个答案可用但却让我找到了正确的解决方案,所以我想提供我的意见。问题出在以前的foreign constraint上,想一想就很明显。

所以在你新的migration的up方法中,首先删除原始的constraint,重命名列名,然后使用新的列名再次添加constraint。在down方法中,执行相反的操作,以使其回到已解决的状态。

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('proxy4s', function (Blueprint $table) {
        // Drop it
        $table->dropForeign(['server_id']);

        // Rename
        $table->renameColumn('server_id', 'linux_server_id');

        // Add it
        $table->foreign('linux_server_id')->references('id')->on('linux_servers');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('proxy4s', function (Blueprint $table) {
        // Drop it
        $table->dropForeign(['linux_server_id']);

        // Rename
        $table->renameColumn('linux_server_id', 'server_id');

        // Add it
        $table->foreign('server_id')->references('id')->on('linux_servers');
    });
}
希望这篇文章能在未来帮助到某些人!

"发表我的意见" - Attila Fulop

4

要重命名一个列,您可以在模式构建器上使用renameColumn方法。

Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
});


2

如果您不想使用doctrine/dbal包,可以使用查询DB语句。例如:

public function up()
{
    DB::statement('ALTER TABLE table_name CHANGE from to VARCHAR(200)');
}

public function down()
{
    DB::statement('ALTER TABLE table_name CHANGE to from VARCHAR(200)');
}

2
我知道这是一个老问题,但我最近在Laravel 7应用程序中遇到了同样的问题。 为了使重命名列起作用,我使用了答案中的技巧,其中我发出了composer require doctrine/dbal:^2.12.1而不是composer require doctrine/dbal,因为最新版本的doctrine/dbal仍会抛出错误。
请记住,如果您已经使用更高版本,则此答案可能不适合您。

1

只需按照以下步骤进行操作:

第一步:安装dbal包

composer require doctrine/dbal

步骤2:创建迁移并按照下面的方式更新

Schema::table('your original table name', function (Blueprint $table) {
   $table->renameColumn('old column name', 'new column name');
});

第三步:运行artisan命令
php artisan migrate

完整描述链接:https://www.webjourney.dev/how-to-rename-table-column-in-laravel-webjourney

1
在我的情况下,我将一个列命名为"avitar",但我希望它是"avatar"。
我运行了以下命令: php artisan make:migration rename_avitar_in_users_table --table=users
这将生成一个模板文件,我在其中添加了以下内容: $table->renameColumn('avitar', 'avatar'); // 在up方法中 $table->renameColumn('avitar', 'avatar'); // 在down方法中
public function up(): void
{

    Schema::table('users', function (Blueprint $table) {
        $table->renameColumn('avitar', 'avatar');
    });
}

/**
 * Reverse the migrations.
 */
public function down(): void
{
    Schema::table('users', function (Blueprint $table) {
        $table->renameColumn('avitar', 'avatar');
    });
}

然而,当我运行时,这并没有起作用。
php artisan migrate

解决方法是安装以下内容:
composer require doctrine/dbal

希望这能帮助到正在解决类似问题的人。 - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接