Миграция Laravel 5.4 ENUM не работает в MySQL

Когда я пытаюсь применить свою миграцию, я получаю эту ошибку:

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

Миграция применяется, столбец enum создается в базе данных, и я получаю ошибку, поэтому я не могу выполнить миграции nexts, потому что эта миграция выдает эту ошибку.

На сервере у меня MySQL версии 5.7.17

Это код моей миграции:

class AddDocumentUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('document', 9)->unique();
            $table->enum('document_type', ['dni', 'nie', 'nif', 'cif']);
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('document');
            $table->dropColumn('document_type');
        });
    }
}

Спасибо;)

2 ответа

Решение

Информацию, касающуюся строго laravel, можно найти здесь. Я настоятельно советую вам прочитать ветку. Это НЕ проблема Laravel, это ошибка в Доктрине с незапамятных времен.

Из темы вопроса выше, пользователь henritoivar есть интересная идея.

Цитирую здесь:

Это сработало для меня в laravel 5.2 с doctrine/dbal@^2.5 . Если у вас есть перечисление на вашей таблице, и вы хотите изменить любой из столбцов в таблице, вам необходимо:

public function up()
{
   Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');

    Schema::table('jobs', function(Blueprint $table)
    {
        $table->decimal('latitude', 10, 6)->nullable()->change();
    });
}

Я понятия не имею, сработает ли это для вас, но стоит попробовать.


Я бы написал это как комментарий, но это чертовски долго читать.

Из официальных документов Доктрины:

Система типов Doctrine 2 состоит из маховиков, что означает, что существует только один экземпляр любого данного типа. Кроме того, типы не содержат состояния. Оба предположения усложняют работу с типом MySQL типа Enum, который довольно часто используется разработчиками. При использовании Enums с ненастроенным приложением Doctrine 2 вы получите ошибки от команд Schema-Tool из-за неизвестного типа базы данных "enum". По умолчанию Doctrine не отображает тип перечисления MySQL на тип Doctrine. Это связано с тем, что перечисления содержат состояния (их допустимые значения), а типы Doctrine - нет.

Технически говоря, это можно решить. Смотрите здесь. Но это относится строго к Symfony, на котором основан Laravel.


Документы Laravel также заявили, что у него есть проблема сenums:

Переименование любого столбца в таблице, в которой также есть столбец типа enum, в настоящее время не поддерживается.


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


Более связанные вопросы:

Как включить ENUM в Symfony 2 / Doctrine

Laravel 5.1 Запрошен неизвестный тип базы данных

В файле миграции, который содержит тип ENUM, добавьте метод конструктора со следующим:

public function __construct() {
    // Register ENUM type
    DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
}

Это сработало для меня в Laravel 5.2. Вы можете попробовать добавить это на более высоком уровне, но это было быстрее для меня:)

Другие вопросы по тегам