Laravel 5.4迁移ENUM在MySQL中失败

时间:2017-02-06 16:14:32

标签: php mysql laravel-5 laravel-migrations

当我尝试应用迁移时,出现此错误:

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

应用迁移,在数据库上创建枚举列,我收到错误,因此我无法执行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 个答案:

答案 0 :(得分:6)

可以找到与laravel严格相关的信息here。我强烈建议你阅读帖子。这不是一个laravel问题,它一直是Doctrine中的一个错误。

从上面的问题主题中,用户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();
    });
}

我不知道这是否适合你,但值得一试。

我会将此作为评论发布,但这是一个该死的长读。

From the official Doctrine documents

  

Doctrine 2的类型系统由flyweights组成,意思是   只有一个任何给定类型的实例。另外类型呢   不包含国家。这两种假设都使得工作变得相当复杂   使用MySQL的Enum Type,开发人员使用了很多。   当使用带有非调整的Doctrine 2应用程序的Enums时,由于未知,您将从Schema-Tool命令中获得错误   数据库类型“枚举”。默认情况下,Doctrine不映射MySQL枚举   键入Doctrine类型。这是因为Enums包含状态(他们的   允许的值)和Doctrine类型没有。

从技术上讲,这可以解决。见here。但这与Laravel所依据的symfony严格相关。

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

  

重命名同时具有enum类型列的表中的任何列目前都不支持。

虽然这不是一个答案,但我希望它指出你正确的方向,或者至少让你知道你面临的是什么。

更多相关问题:

How to enable ENUMs in Symfony 2 / Doctrine

Laravel 5.1 Unknown database type enum requested

答案 1 :(得分:0)

在包含ENUM类型的迁移文件中,添加一个带有以下内容的构造函数方法:

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

这在Laravel 5.2中对我有用。您可以尝试在更高级别添加此项,但这对我来说更快:)