删除然后在当前向上迁移功能中创建相同的列

时间:2015-02-15 11:24:34

标签: laravel laravel-4 migration

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收到相同的错误。我有点理解为什么会这样,所以我要问的只是解决方法。

是否可以在一次迁移中制作我想要的内容,或者我必须创建一个用于删除列的迁移,然后单独迁移以便按照我想要的方式创建它们?

2 个答案:

答案 0 :(得分:7)

将模式分解为两个调用

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

这种方式是在一次迁移中进行了两次数据库调用。

答案 1 :(得分:1)

请考虑,如果删除这些列,则将丢失其中包含的所有数据。通常,这是一个非常糟糕和危险的想法。如果您只需要简单地更改参数,则应使用change()函数对架构进行必要的修改。这样会将现有数据转换为数据库的最佳功能。

除非您完全知道自己在做什么,否则请不要在正在使用的数据库上删除列。

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