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

Laravel 在当前向上迁移函数中删除并创建相同的列,laravel,laravel-4,migration,Laravel,Laravel 4,Migration,这就是我现在得到的。因此,我的表中有现有的atm列,但我想对它们进行一些修改和重新排列。但是当我运行迁移时,我得到一个SQL错误,即email列存在。对于bio和时间戳,我可能也会得到相同的错误。我有点理解为什么会发生这种情况,所以我所要求的只是一个解决办法 是否可以在一次迁移中实现我想要的功能,或者我必须创建一个用于删除列的迁移,然后再创建一个单独的迁移,以我想要的方式创建列?只需将架构分成两个调用即可 Schema::table('users', function (Blueprint $t

这就是我现在得到的。因此,我的表中有现有的atm列,但我想对它们进行一些修改和重新排列。但是当我运行迁移时,我得到一个SQL错误,即
email
列存在。对于
bio
时间戳
,我可能也会得到相同的错误。我有点理解为什么会发生这种情况,所以我所要求的只是一个解决办法


是否可以在一次迁移中实现我想要的功能,或者我必须创建一个用于删除列的迁移,然后再创建一个单独的迁移,以我想要的方式创建列?

只需将架构分成两个调用即可

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

这样,在一次迁移和两次数据库调用中就会发生更改。

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

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

public function up()
{
Schema::table('users',函数(Blueprint$table){
//例如,添加唯一约束
$table->string('email',20)->unique()->after('id')->change();
//例如,将长度添加到bio
$table->string('bio',150)->在('姓氏')->change()之后;
});
}
公共职能部门
{
Schema::table('users',函数(Blueprint$table){
//删除长度和约束
$table->string('email')->unique(false)->change();
$table->string('bio')->change();
});
}

此解决方案解决了他们的问题,但可能不安全,因为它会导致数据丢失。您应该更改列,而不是删除它们。@Oranges13-问题的标题是“删除,然后创建列”-因此这正是OP要求的。也许,但有时新开发人员会问错误的问题。我公司的一位小开发人员向我提出了这个问题,因为他们说这是他们在谷歌搜索时找到的解决方案,我想确保没有其他人卷入他们可能丢失数据的问题。这就是为什么我提出了另一种解决方案,并为您不想在所有情况下放弃提供了理由。
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();
    });
}