web-dev-qa-db-fra.com

Supprimer la colonne de la base de données dans Laravel 5.2

J'ai un blog pour lequel la articles table Schema est définie comme suit:

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

Je veux supprimer les colonnes comment_count et view_count sans perdre les données existantes dans la table

J'ai défini une nouvelle migration comme ceci:

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

et j'ai fait php artisan migrate. La migration a été effectuée avec succès, mais les deux colonnes ne sont pas supprimées.

Qu'est-ce que je fais mal? Comment puis-je supprimer ces colonnes sans perdre les données existantes dans la table?

26
byteseeker

Votre migration doit ressembler à ceci:

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

La méthode dropColumn dans la méthode up, car avec la nouvelle migration, vous souhaitez supprimer ces colonnes. Si vous faites une restauration, vous avez une autre fois les deux colonnes

51
Sangar82

Même peut même supprimer les colonnes multiples en une seule ligne en passant colonne de tableau à dropColumn function.

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

Au cas où votre contrainte foregin key contraindrait tout d’abord, supprimez l’association d’index de clé étrangère, puis transmettez la colonne à la fonction dropColumn avec les autres fonctions de la manière suivante 

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']);
    });
}
2
Channaveer Hakari

Ajoutez simplement ce code dans votre fichier down () function dans le fichier migration.php

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

puis lancez -> php artisan migrate: rollback

0
Vaibhav Bacchav