Удаление столбца из базы данных в Laravel 5.2

У меня есть блог, для которого таблица articles Schema определяется следующим образом:

public function up()
{
    Schema::create('articles', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id')->unsigned();
        $table->string('title');
        $table->string('thumb')->nullable();
        $table->text('excerpt');
        $table->text('body');
        $table->string('slug')->unique();
        $table->integer('comment_count')->unsigned()->default(0);
        $table->integer('view_count')->unsigned()->default(0);
        $table->timestamps();
        $table->softDeletes();
}

public function down()
{
    Schema::drop('articles');
}

Я хочу удалить столбцы comment_count и view_count без потери существующих данных в таблице

Я определил новую миграцию следующим образом:

class RemoveCommentViewCount extends Migration
{
    public function up()
    {
        //nothing here
    }

    public function down()
    {
        Schema::table('articles', function($table) {
           $table->dropColumn('comment_count');
           $table->dropColumn('view_count');
       });
   }
}

и я сделал php artisan migrate. Он успешно выполнил миграцию, но два столбца не удалены.

Что я делаю неправильно? Как я могу удалить эти столбцы, не потеряв существующие данные в таблице?

Ответ 1

Ваша миграция должна выглядеть так:

 Class RemoveCommentViewCount extends Migration
  {
      public function up()
      {
          Schema::table('articles', function($table) {
             $table->dropColumn('comment_count');
             $table->dropColumn('view_count');
          });
      }

      public function down()
      {
          Schema::table('articles', function($table) {
             $table->integer('comment_count');
             $table->integer('view_count');
          });
      }
  }

DropColumn в методе up, потому что при новой миграции вы хотите удалить эти столбцы. Если вы выполните откат, у вас есть другой раз два столбца

Ответ 2

Даже вы можете удалить несколько столбцов в одной строке, передав столбец массива в функцию dropColumn.

Class RemoveCommentViewCount extends Migration
  {
      public function up()
      {
          Schema::table('articles', function($table) {
             $table->dropColumn(['comment_count', 'view_count']);
          });
      }

      public function down()
      {
          Schema::table('articles', function($table) {
             $table->integer('comment_count');
             $table->integer('view_count');
          });
      }
  }

В случае, если у вас есть ограничение ключа foregin, то сначала отбросьте ассоциацию индекса внешнего ключа, а затем можете передать столбец в функцию dropColumn вместе с другими в следующей последовательности:

public function up()
{
    Schema::table('customer_orders', function($table) {
        $table->dropForeign(['product_id']);
        $table->dropForeign(['shipping_address_id']);
        $table->dropColumn(['product_id', 'shipping_address_id', 'column1', 'column2']);
    });
}

Ответ 3

Просто добавьте этот код в свою функцию down() в файле migration.php

Schema::table('articles', function (Blueprint $table) {
   $table->integer('comment_count')->unsigned()->default(0);
   $table->integer('view_count')->unsigned()->default(0);
});

а затем запустите → php artisan migrate: rollback