it-roy-ru.com

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 может не поддерживать его.

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

15
Latheesan

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

Примечание: переименование типов столбцов 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

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

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

19
Gmatkowski

Я столкнулся с этой проблемой в 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 может не поддерживать его.

Затем я попробовал следующий raw 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`");

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

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

6
Ihor Havryliv

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

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

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

У меня была та же проблема с 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»);

1
Deric Lima

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

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

1
DfKimera

Вот ответ для 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();
    });
}
0
zeros-and-ones