Laravel 5.4迁移ENUM在MySQL中失败

Iva*_*lla 3 php mysql laravel-5 laravel-migrations

当我尝试应用我的迁移时,我收到此错误:

[Doctrine\DBAL\DBALException]
Unknown database type enum requested, Doctrine\DBAL\Platforms\MySQL57Platform may not support it.
Run Code Online (Sandbox Code Playgroud)

应用迁移,在数据库上创建枚举列,我得到错误,因此我无法执行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');
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢 ;)

And*_*rei 8

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

从上面的问题线程,用户henritoivar有一个有趣的想法.

引用这里:

这对我来说是laravel 5.2 with 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();
    });
}
Run Code Online (Sandbox Code Playgroud)

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


我会发布这个评论,但这是一个该死的长读.

从官方的Doctrine文件:

Doctrine 2的类型系统由flyweights组成,这意味着任何给定类型只有一个实例.此外,类型不包含状态.这两种假设都使得使用开发人员大量使用的Enum Type of MySQL变得相当复杂.当使用带有非调整的Doctrine 2应用程序的Enums时,由于未知的数据库类型"enum",您将从Schema-Tool命令中获得错误.默认情况下,Doctrine不会将MySQL枚举类型映射到Doctrine类型.这是因为Enums包含state(它们允许的值),而Doctrine类型则不包含.

从技术上讲,这可以解决.看到这里.但这与Laravel所依据的symfony严格相关.


Laravel的文档还说它有一个问题enums:

重命名表中也包含enum类型列的任何列>目前不受支持.


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


更多相关问题:

如何在Symfony 2/Doctrine中启用ENUM

Laravel 5.1请求未知数据库类型枚举