2017-02-06 6 views
2

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

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

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

На сервере, у меня есть 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'); 
     }); 
    } 
} 

Спасибо;)

+0

Чтение документации laravel, я вижу: _ «Следующие типы столбцов не могут быть« изменены »: char, double, enum, mediumInteger, timestamp , tinyInteger, ipAddress, json, jsonb, macAddress, mediumIncrements, morphs, nullableMorphs, nullableTimestamps, softDeletes, timeTz, timestampTz, timestamps, timestampsTz, unsignedMediumInteger, unsignedTinyInteger, uuid. "_ Но я не пытаюсь изменить столбец, я пытаюсь создать это. –

ответ

5

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

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

Цитирование здесь:

This worked for me in laravel 5.2 with doctrine/[email protected]^2.5 . When you have an enum on your table and you want to change any of the columns on the table you will have to:

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

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

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


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

From the official Doctrine documents:

The type system of Doctrine 2 consists of flyweights, which means there is only one instance of any given type. Additionally types do not contain state. Both assumptions make it rather complicated to work with the Enum Type of MySQL that is used quite a lot by developers. When using Enums with a non-tweaked Doctrine 2 application you will get errors from the Schema-Tool commands due to the unknown database type “enum”. By default Doctrine does not map the MySQL enum type to a Doctrine type. This is because Enums contain state (their allowed values) and Doctrine types don’t.

С технической точки зрения это может быть решена. См. here. Но это относится строго к symfony, на котором основан Laravel.


Laravel's docs also stated that it has a problem with enums:

Renaming any column in a table that also has a column of type enum is >not currently supported.


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


Более родственные вопросы:

How to enable ENUMs in Symfony 2/Doctrine

Laravel 5.1 Unknown database type enum requested

0

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

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

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

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

  • Нет связанных вопросов^_^