Миграция базы данных 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
".
Также я нашел эту статью, которая фокусируется на этой проблеме и предлагает вариант, который может вам помочь.
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');");
}