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

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