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

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

Я немного искал вашу проблему, и я узнал, что это известная проблема.

В документах Laravel ( http://laravel.com/docs/4.2/schema#renaming-columns ) говорится, что

Примечание . Переименование типов столбцов 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, и нам нужно добавить его в композитор.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`"); 

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

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

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

 public function __construct(\Doctrine\DBAL\Migrations\Version $version) { parent::__construct($version); $this->platform->registerDoctrineTypeMapping('enum', 'string'); } 

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

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

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

Обязательно проверяйте изменения совместимости в сводке изменений выпуска