Миграция базы данных Laravel - ошибка renameColumn - запрашивается перечисление неизвестного типа базы данных

Я использую Laravel 4.2, У меня есть следующая библиотека загружена в мой composer.json

"doctrine/dbal": "2.4.*",

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

class RenameDeliveryNotesColumnOnOrderHeaderTable extends Migration {

    public function up()
    {
        Schema::table('order_header', function(Blueprint $table)
        {
            $table->renameColumn('delivery_notes', 'packing_notes');
        });
    }

}

куда delivery_notes тип столбца text,

Когда я запускаю миграцию, я получаю следующую ошибку:

[Doctrine \ DBAL \ DBALException] Запрошено перечисление неизвестного типа базы данных, Doctrine\DBAL\Platforms\MySqlPlatform может не поддерживать его.

Есть идеи, почему я получаю эту ошибку? Как мне исправить это? Мне нужно переименовать столбец в моей таблице. Есть ли альтернативный способ переименовать колонку?

7 ответов

Решение

Документация Ларавела гласит:

Примечание: переименование enum типы столбцов не поддерживаются.

Здесь: https://github.com/laravel/framework/issues/1186

Вы можете найти некоторые обходные пути по этой проблеме. И так как вы сказали, что эта колонка не enumвзгляните на комментарий @upngo:

"... Проблема заключается в переименовании ЛЮБОГО столбца в таблице, которая имеет enum".

Также я нашел эту статью, которая фокусируется на этой проблеме и предлагает вариант, который может вам помочь.

http://www.paulbill.com/110/laravel-unknown-database-type-enum-requested-doctrinedbalplatformsmysqlplatform-may-not-support-it

DB::getDoctrineSchemaManager()
    ->getDatabasePlatform()
    ->registerDoctrineTypeMapping('enum', 'string');

Это работает для меня на Laravel 5.1

Я столкнулся с этой проблемой в Laravel версии 5.1.19 (LTS). Это актуально и для более ранних версий. Я хотел бы сообщить вам, как я решил вопрос базы на основе предыдущих комментариев.

Прежде всего, я попробовал следующий код в моем файле миграции:

$table->renameColumn('column_name');

Но после команды php artisan migrateЯ получил следующую ошибку:

[Symfony \ Component \ Debug \ Exception \ FatalErrorException] Класс 'Doctrine\DBAL\Driver\PDOMySql\Driver' не найден

Как вы знаете, DBAL был удален из ядра laravel, и нам нужно добавить его в composer.json.(Например:"require": {"doctrine/dbal": "2.5.1"}). Я установил DBAL как требуется и попытался снова выполнить команду переноса, но получил следующую ошибку:

[Учение \DBAL\DBALException]
Запрошено перечисление неизвестного типа базы данных, Doctrine\DBAL\Platforms\MySqlPlatform может не поддерживать его.

Затем я попытался следующий сырой sql в моем файле миграции: для up():

DB::statement("ALTER TABLE `table_name` CHANGE `old_column_name` `new_column_name` ENUM('first value', 'second_value', ...) DEFAULT 'first_value' AFTER `some_field`");

За down():

DB::statement("ALTER TABLE `table_name` CHANGE `new_column_name` `old_column_name` ENUM('first value', 'second_value', ...) DEFAULT 'first_value' AFTER `some_field`");

и это работает.

PS Для переименования других полей в таблице, которая содержит поле enum, мы должны использовать ту же схему с raw sql, как было написано в предыдущих комментариях.

Вы можете добавить пользовательский конструктор к миграции и объяснить Doctrine, что enum должен рассматриваться как строка.

public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
    parent::__construct($version);

    $this->platform->registerDoctrineTypeMapping('enum', 'string');
}

Вот ответ для Laravel 5.2.45+ (может работать и в 5.1, еще не проверял и не проверял, пожалуйста, дайте мне знать, чтобы я мог обновить этот вопрос.)

Добавьте эту строку в свой метод up:

Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');

Что-то вроде этого:

public function up()
{
    Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
    Schema::table('users', function (Blueprint $table) {
         $table->text('bio')->change();
    });
}

У меня была такая же проблема с Laravel 5.1 и PostGres. Так что в основном я использовал DB::statement создать ENUM и решить проблему:

DB:: Statement("CREATE TYPE e_users AS ENUM('data1','data2')");

А потом:

DB:: оператор ("ALTER TABLE users ADD COLUMN столбец e_users");

Хотя у первоначального автора были проблемы с Laravel 4, это можно безопасно исправить в Laravel 5, изменив версиюdoctrine/dbal в вашем composer.json в ^2.6, как это было исправлено в этом PR на выпуске 2.6.0

Обязательно проверьте наличие изменений, нарушающих совместимость, в журнале изменений выпуска.

В настоящее время для этой проблемы нет законного решения, кроме исключения перечислений, но есть обходной путь:

Создайте миграцию со следующим:

public function up()
{
    DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2', 'enum3+');");
}

И это поможет с обновлением ENUM, которое вы ищете. Кроме того, вы можете создать функции дескриптора, чтобы вернуть статус поля, как это было раньше:

 public function down() 
 {
     DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2');"); 
 }
Другие вопросы по тегам