web-dev-qa-db-ja.com

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をしました。移行は成功しましたが、2つの列は削除されません。

私は何を間違えていますか?テーブル内の既存のデータを失わずにこれらの列を削除するにはどうすればよいですか?

33
byteseeker

移行は次のようになります。

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

UpメソッドのdropColumn。これは、新しい移行ではこの列を削除するためです。ロールバックを行うと、2つの列がもう一度あります

68
Sangar82

配列の列をdropColumn関数に渡すことで、複数の列を1行でドロップできます。

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 key制約を持っている場合は、まず外部キーインデックスの関連付けを削除してから、次のようなストレッチで他のユーザーと共に列を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