symfony Laravel迁移-删除列

tyu7yeag  于 2022-11-16  发布在  其他
关注(0)|答案(3)|浏览(144)

我需要从数据库表clients中删除列UserDomainName
首先,我通过执行composer require doctrine/dbalcomposer update来安装doctrine/dbal,如文档中所述。
然后,我创建了要用于删除列的迁移:

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.

hwamh0ep

hwamh0ep1#

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

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

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

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

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

mf98qq94

mf98qq942#

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

此解决方案已在Laravel 9.x上测试,可能无法在较低版本中运行
在迁移文件的down方法中,使用Schema::dropColumns方法,第一个参数是表名,第二个参数是要放入数组中的列名。

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

参考文献

解决方案2:旧方法

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

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

hgncfbus3#

要删除列,您可以这样做
在down函数中应该有:

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

然后运行php artisan migrate:rollback
就这样了

相关问题