Я использую 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
».
Также я нашел эту статью, которая фокусируется на этой проблеме и предлагает вариант, который может вам помочь.
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
Обязательно проверяйте изменения совместимости в сводке изменений выпуска