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

问题描述 投票:0回答:11

我有如下提到的专栏:

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 桌子上制作了播种机

现在我想将

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)
php mysql database laravel migration
11个回答
185
投票

您需要创建另一个迁移文件 - 并将其放在其中:

奔跑

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');
        });
    }

}

53
投票

按照以下步骤分别重命名列迁移文件。

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

composer require doctrine/dbal

2- 创建更新迁移文件以更新旧迁移文件。 警告(需要同名)

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');
});

“从”我的旧列名称和“到”我的新列名称

4- 最后运行迁移命令

php artisan migrate

源码链接:laravel文档

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

更新: 版本 9 之后这个过程变得更加容易 您所要做的就是使用“Schema”外观的“重命名”静态方法。

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

来源链接: laravel document-9.x


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');
    });
}

在你的向下方法中:

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

然后在命令行中输入

php artisan migrate

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

php artisan migrate:rollback

撤消更改。祝你好运


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


15
投票

我把 0.02 美元扔在这里,因为所有答案都不起作用,但确实让我走上了正确的道路。发生的情况是之前的外部约束引发了错误。当你想一想就很明显了。

因此,在新迁移的

up
方法中,首先删除原始约束,重命名该列,然后使用新列名称再次添加约束。在
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');
    });
}

希望这可以在将来节省某人的时间!


4
投票

要重命名列,您可以使用架构构建器上的 renameColumn 方法。

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


2
投票

我知道这是一个老问题,但我最近在 Laravel 7 应用程序中遇到了同样的问题。 为了使重命名列起作用,我使用了 this 答案中的提示,而不是

composer require doctrine/dbal
我已经发布了
composer require doctrine/dbal:^2.12.1
,因为最新版本的doctrine/dbal 仍然会引发错误。

请记住,如果您已经使用更高版本,则此答案可能不适合您。


2
投票

如果您不想使用 doctrine/dbal 包,请使用查询数据库语句。例如:

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)');
}

1
投票

只需按照以下步骤进行即可

第1步:安装dbal包

composer require doctrine/dbal

第 2 步:创建迁移并更新,如下所示

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

第 3 步:运行 artisan 命令

php artisan migrate

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


0
投票

就我而言,我将一个列命名为“avitar”并希望它成为“avatar”。

我跑了:

php artisan make:migration rename_avitar_in_users_table --table=users

生成了我添加的样板文件:

$table->renameColumn('avitar', 'avatar'); // 向上

$table->renameColumn('avitar', 'avatar'); // 向下

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

我希望这可以帮助解决类似问题的人。 -史蒂夫


-1
投票

上面的答案很好,或者如果它不会伤害您,只需回滚迁移并更改名称并再次运行迁移即可。

 php artisan migrate:rollback
© www.soinside.com 2019 - 2024. All rights reserved.