Миграции Laravel изменяют тип столбца от varchar до longText

Мне нужно изменить с типом столбца миграции $table->string('text'); на тип текста, я попытался сделать это несколькими способами, но никто из них не работал. Можно ли это сделать за одну миграцию. Я мог бы догадаться о том, чтобы удалить столбец, а затем создать его снова с помощью нового типа, но мне интересно, можно ли это сделать в одном переносе?

Ответ 1

Вы можете создать новую миграцию и изменить только один тип столбца:

public function up()
{
    Schema::table('sometable', function (Blueprint $table) {
        $table->text('text')->change();
    });
}

Вам нужно установить doctrine/dbal чтобы сделать эту работу

composer require doctrine/dbal

Ответ 2

Согласно Laravel Doc

Вы можете сделать это, как

Schema::table('yourTable', function (Blueprint $table) {
    $table->text('text')->change();
});

обязательно добавьте зависимость doctrine/dbal к вашему файлу composer.json

Ответ 3

Это возможно сделать с миграцией TABLE.

Как упоминалось в других сообщениях, обязательно запустите composer install doctrine/dbal из корня проекта.

Они настроены с помощью:

php artisan make:migration alter_table_[yourtablenamehere]_change_[somecolumnname] --table=[yourtablenamehere]

из корня проекта.

Из документации:

https://laravel.com/docs/master/migrations#modifying-columns

class AlterTableSomething extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('table', function (Blueprint $table) {
            $table->text('column_name')->change();
        });
    }
}

Ответ 4

Если вы получаете следующую ошибку, используя change()

Неизвестный запрос типа базы данных, Doctrine\DBAL\Platforms\MySQL80Platform может не поддерживать его.

это означает, что существует некоторая колонка (не обязательно измененная) в вашей таблице, которая имеет тип перечисления. Поэтому вместо использования функции change() вы можете использовать следующую функцию:

public function changeColumnType($table, $column, $newColumnType) {                
    DB::statement("ALTER TABLE $table CHANGE $column $column $newColumnType");
} 

И используйте его так: $this->changeColumnType('sometable','text','TEXT');