【问题标题】:How can I rename column in laravel using migration?如何使用迁移重命名 laravel 中的列?
【发布时间】:2014-12-18 18:41:37
【问题描述】:

我有如下所述的列:

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


    【解决方案1】:

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

    运行

    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 中有错误消息
    • 错误 150 是外键限制。这意味着您有其他表引用了stnk 表上的id
    • 注意 Laravel 5 现在是 make:migration 而不是 migrate:make
    • 为了使列重命名工作,你需要一个在 L5 "doctrine/dbal": "~2.3" 中删除的包,否则你会得到一些非常模糊的错误。它在github.com/laravel/framework/issues/3116 此处作为一个错误提出,并且在此处laravel.com/docs/5.0/schema#renaming-columns 的文档中提及的用处可能不大。
    • 迁移完成后,是否应该删除文件并更新原始创建架构?只是问如何保持清洁
    【解决方案2】:

    按照这些步骤,分别重命名列迁移文件。

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

    '来自'我的旧列名和'to'我的新列名

    4-最后运行迁移命令

    php artisan migrate
    

    来源链接:laravel document

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

    【讨论】:

      【解决方案3】:

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

      输入你的命令行

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

      创建文件后。在 database/migrations 下的 app 文件夹中打开新创建的迁移文件。

      在你的 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 中有错误消息
      • 请务必在您的 composer.json 文件中添加学说/dbal 依赖项。
      【解决方案4】:

      重命名列(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 中使用 ma​​ke:migration 而不是 migrate:make

      【讨论】:

      • 只是不要在您尝试编辑的表中使用任何列作为 ENUM。 Doctrine/dbal 不知道这是什么.....我不得不在开始时将原始迁移更改为正确的名称并重置整个数据库。幸运的是,我仍在开发中。虽然 Laravel & Co 会从一开始就让它成为作曲家的依赖项?
      • @mikoop 在早期版本的框架中,它从一开始就是一个依赖项。但是这种依赖太重,不常用。所以它被删除了。 (这是摘要;在做出决定之前进行了很多讨论。事实上,社区已经要求将其删除,并且已经听取了意见。)
      • renameColumn 在教义中已被弃用,目前已被删除。
      【解决方案5】:

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

      希望这可以为将来节省一些时间!

      【讨论】:

      • “扔掉我的 0.02 美元”? ?
      【解决方案6】:

      我知道这是一个老问题,但我最近在 Laravel 7 应用程序中遇到了同样的问题。 为了使重命名列起作用,我使用了来自this 答案的提示,而不是composer require doctrine/dbal 我已经发布了composer require doctrine/dbal:^2.12.1,因为最新版本的学说/dbal 仍然会引发错误。

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

      【讨论】:

        【解决方案7】:

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

         php artisan migrate:rollback
        

        【讨论】:

        • 我已经编辑了我上面的问题,现在看看.. 我在 gitbash 中有错误消息
        【解决方案8】:

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

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

        【讨论】:

          猜你喜欢
          • 2018-12-10
          • 2018-07-18
          • 2018-08-20
          • 2015-07-28
          • 2017-06-10
          • 2018-09-19
          • 2019-08-24
          • 2020-06-22
          • 1970-01-01
          相关资源
          最近更新 更多