Миграция 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, добавьте метод конструктора со следующим:
public function __construct() {
// Register ENUM type
DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
}
Это сработало для меня в Laravel 5.2. Вы можете попробовать добавить это на более высоком уровне, но это было быстрее для меня:)