2015-03-20 2 views
15

Я использую Laravel 4.2. У меня есть следующие библиотеки загружены в моем composer.jsonLaravel db migration - renameColumn error - Неизвестный тип базы данных enum запрошен

"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] Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.

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

+0

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

+0

У меня нет других миграций, оставшихся до запуска до этого. уже проверено. – Latheesan

ответ

15

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

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

Note: Renaming enum column types is not supported.

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

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

"...The issue is renaming ANY column on a table that has an enum ."

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

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

4

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

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

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

Кажется, что не работает в текущих версиях? Я нахожусь на Laravel 5.1 – Volatil3

+0

здесь же, на Laravel 5.2 – Laurent

16

DB :: getDoctrineSchemaManager() -> getDatabasePlatform() -> registerDoctrineTypeMapping ('перечисление', 'строка');

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

+0

где запускать эту команду? – Aditya

+0

Вы вкладываете его в какой-то файл начальной загрузки? –

+2

Нет, вы должны запустить это из файла миграции, лучше всего в методе построения. – Gmatkowski

6

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

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

$table->renameColumn('column_name'); 

Но после того, как команда php artisan migrate, я получил следующую ошибку:

[Symfony\Component\Debug\Exception\FatalErrorException] Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found

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

[Doctrine\DBAL\DBALException]
Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.

Затем я попробовал следующий необработанный 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. Чтобы переименовать другие поля в таблице, которая содержит поле перечисления, мы должны использовать такую ​​же схему с сырым sql, как было написано в предыдущих комментариях, .

1

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

0

Вот ответ на 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(); 
    }); 
} 
0

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

Убедитесь, что для проверки совместимости с авангардными изменения в release changelog

Смежные вопросы