Во время миграции php artisan я получил следующую ошибку
[Учение \ DBAL \ DBALException]
Неизвестный запрос типа базы данных, Doctrine \ DBAL \ Platforms \ MySqlPlatform может не поддерживать его.
Как решить эту проблему.
Код:
public function up() { Schema::table('blogs', function (Blueprint $table) { $table->string('wordpress_id')->nullable(); $table->string('google_blog_id')->nullable()->change(); }); }
Официальная документация Laravel 5.1 гласит:
Примечание. Переименование столбцов в таблице с столбцом перечисления в настоящее время не поддерживается.
Не имеет значения, пытаетесь ли вы изменить другой столбец, если таблица содержит enum
любом месте, где оно не будет работать. Это проблема DBAL Doctrine.
В качестве обходного пути вы можете либо удалить столбец, либо добавить новый ( данные столбца будут потеряны ):
public function up() { Schema::table('users', function(Blueprint $table) { $table->dropColumn('name'); }); Schema::table('users', function(Blueprint $table) { $table->text('username'); }); }
или использовать инструкцию DB:
public function up() { DB::statement('ALTER TABLE projects CHANGE slug url VARCHAR(200)'); } public function down() { DB::statement('ALTER TABLE projects CHANGE url slug VARCHAR(200)'); }
Это известный вопрос, как указано в документации Laravel 5.1.
Примечание. Переименование столбцов в таблице с столбцом
enum
в настоящее время не поддерживается.
Это происходит, когда в таблице базы данных имеется столбец enum
. Если вы пытаетесь переименовать другой столбец или изменить другой столбец на nullable
, эта ошибка появится. Это проблема с Doctrine\DBAL
.
Легкое решение для этого – просто добавить этот метод конструктора в файл миграции базы данных.
public function __construct() { DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string'); }
Это отобразит все столбцы ENUM
в VARCHAR()
, и столбец примет любую строку.
Это сработало для меня на Laravel 5.1 и Laravel 5.3. Я надеюсь, что эта ошибка может быть исправлена в ближайшее время.
Ответьте на ответ @ Gmatkowski на https://stackoverflow.com/a/32860409/1193201
Реальное грязное решение, которое выполняет свою работу, тем не менее будет
update Doctrine/DBAL/Schema/MySqlSchemaManager.php
добавив эти строки чуть выше строки 113
$this->_platform->registerDoctrineTypeMapping('enum', 'string'); $type = $this->_platform->getDoctrineTypeMapping($dbType);
Помните, что обновление файлов поставщика напрямую нецелесообразно, поскольку в случае, когда vonder выбирает обновление плагина, ваши изменения могут быть перезаписаны