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


86

我有下面提到的列:

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表

现在我想重命名idid_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)

Answers:


113

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

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 2014年

错误150是外键约束。这意味着您还有其他引用idstnk表上的表的表。
劳伦斯

3
注意事项Laravel 5现在make:migration,而不是migrate:make
贾森-

8
同样,为了使列重命名工作,您需要一个在L5中删除的软件包。否则"doctrine/dbal": "~2.3",您会得到一些非常模糊的错误。有人在github.com/laravel/framework/issues/3116上将其作为错误提出,并在这里的文档laravel.com/docs/5.0/schema#renaming-columns
Jason

迁移完成后,是否应该删除文件并更新原始的创建模式?只是问如何保持环境整洁
轨道

27

您要做的第一件事是创建迁移文件。

在命令行中输入

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

创建文件后。在数据库/迁移下的您的应用文件夹中打开新创建的迁移文件。

在您的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 2014年

1
确保将doctrine / dbal依赖项添加到composer.json文件中。

16

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

1-您的项目中是否有教义/ 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-最后运行migrate命令

php artisan migrate

来源链接: laravel文档


14

重命名列(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而不是migration :make


只是不要在要编辑的表中将任何列用作ENUM。学说/ dbal不知道这是什么.....我不得不在开始时将原始迁移更改为正确的名称,然后重置整个数据库。幸运的是我还在开发中。我是否会从一开始就把Laravel&Co变成作曲家的依赖者?
mikoop'4

@mikoop在框架的早期版本中,它从一开始就是一个依赖项。但是这种依赖性太重了,不常用。因此它已被删除。(这是摘要;决定之前有很多讨论。实际上,社区已要求将其删除,并且已经听到了。)
J. Bruni

在理论上不建议使用namedColumn,目前已将其删除。
桑德·维瑟

9

因为没有答案可以,所以将我的$ 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');
    });
}

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


1

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

 php artisan migrate:rollback

我在上面编辑了我的问题,现在看。.我在gitbash中收到错误消息
Ariasa 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.