Laravel migration dropColumn删除了错误的列

时间:2015-03-19 11:02:13

标签: php laravel model migration rollback

我有一个非常奇怪的问题我无法解释。这让我很担心,因为我正在进行的项目是在线的,有时我可能会更新数据库列。

// Migration file

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class ChangeUserProfilesTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {

        Schema::table('user_profiles', function($table)
        {

            // Keys
            $table->datetime('status_updated_at')->nullable();

        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {

        Schema::table('user_profiles', function($table)
        {

            // Columns to remove
            $table->dropColumn('status_updated_at');

        });

    }

}

现在我迁移,一切运作良好我检查,我的桌子是好的

html(master)$ php artisan migrate
Migrated: 2015_03_19_111236_change_user_profiles_table

这是我的MySQL表的一部分

some columns everything is normal

现在我回滚,听起来很简单。

 html(master)$ php artisan migrate:rollback
 Rolled back: 2015_03_19_111236_change_user_profiles_table

现在我只看看我的桌子,它变得怪异

my column vanished

是的,status列无缘无故地消失了。还有那个应该被删除的人。我尝试了10次它没有工作......我甚至不能再migrate了,因为

   [Illuminate\Database\QueryException]
   SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'status_
   updated_at' (SQL: alter table `user_profiles` add `status_updated_at` datet
   ime null)

有人对此有所了解吗?如果这是一个问题,它是一个很大的问题,因为迁移是项目中非常敏感的东西...我不再相信Laravel了,我想知道我将如何处理这个问题。生产方。

**编辑:要在此处找到解决方案是与此表关联的所有迁移(但不应该被调用...)

我使用的是Laravel 4.2 **

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUserProfilesTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('user_profiles', function($table)
        {

            // Keys
            $table->increments('id');
            $table->integer('user_id')->unsigned()->nullable();
            $table->integer('box_id')->unsigned()->nullable();

            $table->string('stripe_customer');

            $table->string('contract_id');

            // Indexes
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('box_id')->references('id')->on('boxes')->onDelete('cascade');

            // Timestamps
            $table->timestamps();
            $table->softDeletes();

        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {

        Schema::table('user_profiles', function(Blueprint $table)
        {

            $table->dropForeign('user_profiles_user_id_foreign');
            $table->dropForeign('user_profiles_box_id_foreign');

        });

        Schema::dropIfExists('user_profiles');

    }


}

以后

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class ChangeUserProfilesTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('user_profiles', function($table)
        {

            // Keys
            $table->enum('status', array('not-subscribed', 'in-progress', 'subscribed', 'expired'));

        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {

        Schema::table('user_profiles', function(Blueprint $table)
        {

            // Columns to remove
            $table->dropColumn('status');

        });


    }

}

1 个答案:

答案 0 :(得分:2)

我在一些迁移中使用了同名的classe,这让作曲家陷入了困境。 composer dump-autoload允许我看到它。

例如:

 Generating autoload files
 Warning: Ambiguous class resolution, "ChangeBoxQuestionsTable" was found in both      "/Users/Loschcode/Dropbox/htdocs/projets/bordeaux_in_box_lo/html/app/database/migrations/2015_03_12_183836_change_box_questions_table.php" and "/Users/Loschcode/Dropbox/htdocs/projets/bordeaux_in_box_lo/html/app/database/migrations/2015_03_19_040137_change_box_questions_table.php", the first will be used.

所以我手动更改了我的文件/类名称以及数据库migrations表。现在它工作正常;)