Laravel 迁移 - 删除列

Posted

技术标签:

【中文标题】Laravel 迁移 - 删除列【英文标题】:Laravel Migrations - Dropping columns 【发布时间】:2018-01-30 20:42:50 【问题描述】:

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

起初我通过执行composer require doctrine/dbal 后跟composer update 安装doctrine/dbal,如documentation 中所述。

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

php artisan make:migration remove_user_domain_name_from_clients --table=clients

我在down() 方法中添加了Schema::dropColumn('UserDomainName');

<?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.

【问题讨论】:

【参考方案1】:

down 函数用于回滚,您必须在 up 函数中添加此 dropColumn,因为这是您在运行迁移时要执行的操作。

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

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

down 函数中你应该做相反的事情,将列添加回来:

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

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

【讨论】:

我认为dropIfExists 函数只适用于整个表格。 谢谢!我试过了,现在我得到了Call to undefined method Illuminate\Database\Schema\mysqlBuilder::dropColumn() 我尝试解决这个问题然后我再次尝试你的解决方案。 你用过我贴的代码吗?因为在您的示例中,您在 Schema 类上静态使用该函数,这将不起作用。 不要使用dropIfExists('column') 删除整个表! @杰夫【参考方案2】:

要 dropColumn ,你可以这样做

在你的向下功能中应该有:

 public function down()
    
        Schema::table('products', function (Blueprint $table) 
            $table->dropColumn('UserDomainName');
        );
    

然后运行 php artisan 迁移:回滚

就是这样。

【讨论】:

以上是关于Laravel 迁移 - 删除列的主要内容,如果未能解决你的问题,请参考以下文章

laravel 迁移重新组织列顺序

Laravel:在迁移之前删除迁移:重置

Laravel:迁移更改列的默认值(布尔值)

Laravel迁移在现有数据库表中添加列问题

在 Laravel 迁移中更改列类型的最佳方法是啥?

将 created_at 列添加到迁移表 - Laravel