Laravel db migration - renameColumn error - запрошено неизвестное имя типа базы данных
Я использую 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 может не поддерживать его.
Любая идея, почему я получаю эту ошибку? Как мне это исправить? Мне нужно переименовать столбец в моей таблице. Есть ли альтернативный способ переименования столбца?
Ответы
Ответ 1
Я немного искал вашу проблему, и я узнал, что это известная проблема.
Laravel docs (http://laravel.com/docs/4.2/schema#renaming-columns) говорят, что
Примечание: Переименование типов столбцов enum
не поддерживается.
Здесь: https://github.com/laravel/framework/issues/1186
Вы можете найти некоторые обходные пути об этой проблеме. И так как вы сказали, что этот столбец не enum
, посмотрите комментарий @upngo:
"... Проблема заключается в переименовании столбца ANY в таблице с enum
."
Также я нашел эту статью, которая фокусируется на этой проблеме и предлагает вариант, который может вам помочь.
http://www.paulbill.com/110/laravel-unknown-database-type-enum-requested-doctrinedbalplatformsmysqlplatform-may-not-support-it
Ответ 2
DB:: getDoctrineSchemaManager() → getDatabasePlatform() → registerDoctrineTypeMapping ('enum', 'string');
Это работает для меня на Laravel 5.1
Ответ 3
Я встретил эту проблему в 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 по мере необходимости и снова попытался выполнить команду migrate, но получил следующую ошибку:
[Учение\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`");
и он работает.
P.S. Для переименования других полей в таблице, содержащей поле перечисления, мы должны
используйте ту же схему с raw sql, что и в предыдущих комментариях.
Ответ 4
Вы можете добавить настраиваемый конструктор для миграции и объяснить Doctrine, что перечисление должно обрабатываться как строка.
public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
parent::__construct($version);
$this->platform->registerDoctrineTypeMapping('enum', 'string');
}
Ответ 5
У меня была такая же проблема с Laravel 5.1 и PostGres.
Поэтому в основном я использовал DB::statement
для создания ENUM и решения проблемы:
DB:: statement ( "CREATE TYPE e_users AS ENUM ('data1', 'data2')" );
И затем:
DB:: statement ( "ALTER TABLE users ADD COLUMN column e_users" );
Ответ 6
Вот ответ для Laravel 5.2.45+ (может работать и в 5.1, еще не проверен или проверен, пожалуйста, дайте мне знать, чтобы я мог обновить этот вопрос.)
Добавьте эту линию в ваш метод:
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();
});
}
Ответ 7
Хотя у оригинального автора были проблемы с Laravel 4, , это можно безопасно зафиксировать в Laravel 5, нажимая версию doctrine/dbal
в composer.json
на ^2.6
, поскольку она была исправлена в этот PR в версии 2.6.0
Убедитесь, что проверьте изменения совместимости в выпуск журнала изменений