laravel 删除并在当前向上迁移函数中创建相同列

k2fxgqgv  于 2022-12-14  发布在  其他
关注(0)|答案(3)|浏览(79)
Schema::table('users', function (Blueprint $table) {
            $table->dropTimestamps();
            $table->dropColumn(['email', 'bio']);

            $table->string('email', 20)->unique()->after('id');
            $table->string('bio', 150)->after('surname');
            $table->timestamps();
        });

这就是我现在得到的结果。因此,我的表中的列存在atm,但我想修改和重新排列它们。但当我运行迁移时,我得到了存在email列的SQL错误。对于biotimestamps,我可能也会得到相同的错误。我有点理解为什么会发生这种情况,所以我要求的只是一个变通方案。
是否可以在一个迁移中创建所需的内容,或者必须创建一个迁移以删除列,然后创建一个单独的迁移以按照所需的方式创建列?

dgtucam1

dgtucam11#

只需将架构分解为两个调用

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropTimestamps();
        $table->dropColumn(['email', 'bio']);
    });

    Schema::table('users', function (Blueprint $table) {
        $table->string('email', 20)->unique()->after('id');
        $table->string('bio', 150)->after('surname');
        $table->timestamps();
    });
}

这样,更改将在一次 * 迁移 * 中通过两次数据库调用进行。

iyzzxitl

iyzzxitl2#

请注意,如果删除列,则会丢失其中包含的所有数据。通常情况下,这是一个非常糟糕且危险的想法。如果只需要更改参数,则应使用change()函数对模式进行所需的修改。这将转换现有数据,使其达到数据库的最佳性能。
永远不要在正在使用的数据库上DROP COLUMNS,除非你完全知道你在做什么。

public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            // Add the unique constraint, for example
            $table->string('email', 20)->unique()->after('id')->change();
            // Add the length to the bio, for example
            $table->string('bio', 150)->after('surname')->change();
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            // Remove length and constraints
            $table->string('email')->unique(false)->change();
            $table->string('bio')->change();
        });
    }
rnmwe5a2

rnmwe5a23#

这可以通过这种方式来实现。

public function up()
{
    Schema::table('spots', function (Blueprint $table) {
        if (Schema::hasColumn('spots', 'start_date')) {
            $table->dropColumn('start_date');
        }
        if (Schema::hasColumn('spots', 'end_date')) {
            $table->dropColumn('end_date');
        }

        if (!Schema::hasColumn('spots', 'start_date')) {
            $table->timestamp('start_date')->nullable()->after('slug');
        }
        if (!Schema::hasColumn('spots', 'end_date')) {
            $table->timestamp('end_date')->nullable()->after('start_date');
        }     
    });

}

相关问题