Удаление столбца из базы данных в 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