Laravel 迁移 - 删除列

新手上路,请多包涵

我需要从我的数据库表中删除列 UserDomainName clients

起初我安装了 doctrine/dbal 通过执行 composer require doctrine/dbal 然后是 composer update ,如 文档 中所述。

然后我创建了我想用来删除列的迁移:

 php artisan make:migration remove_user_domain_name_from_clients --table=clients

我将 Schema::dropColumn('UserDomainName'); 添加到 down() 方法中:

 <?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class RemoveDomainName extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('clients', function (Blueprint $table) {
            //
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('clients', function (Blueprint $table) {
            Schema::dropColumn('UserDomainName');
        });
    }
}

但是,我得到

Migrating: 2017_08_22_135145_remove_user_domain_name_from_clients
Migrated:  2017_08_22_135145_remove_user_domain_name_from_clients

执行后 php artisan migrate 但没有删除任何列。如果我再次执行它,我会得到 Nothing to migrate.

原文由 Black 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 367
2 个回答

down 函数用于回滚,你必须添加这个 dropColumnup 函数中,因为它正在运行你想要执行的迁移操作。

所以,在你的 up 函数中应该有:

 Schema::table('clients', function (Blueprint $table) {
    $table->dropColumn('UserDomainName');
});

down 函数中,您应该执行相反的操作,将列添加回来:

 Schema::table('clients', function (Blueprint $table) {
    $table->string('UserDomainName');
});

这样,您始终可以返回到迁移中的任何一点。

原文由 Jerodev 发布,翻译遵循 CC BY-SA 3.0 许可协议

解决方案 1:使用单线解决方案

此解决方案在 Laravel 9.x 上测试,它可能不适用于低版本

在迁移文件的 down 方法中使用 Schema::dropColumns 方法,第一个参数是表名,第二个参数是要放入数组的列名。

 public function down()
{
    Schema::dropColumns("tablename", ["column"]);
}

参考

解决方案 2:另一种方法

这里, $table->dropColumn 接受数组或字符串形式的列名。

 public function down()
{
    Schema::table("tablename", function (Blueprint $table) {
        $table->dropColumn(['columnname']);
        // OR
        $table->dropColumn('columnname');
    });
}

原文由 Bedram Tamang 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏