Laravel 5.4 迁移 ENUM 在 MySQL 中失败

Posted

技术标签:

【中文标题】Laravel 5.4 迁移 ENUM 在 MySQL 中失败【英文标题】:Laravel 5.4 migration ENUM fails in MySQL 【发布时间】:2017-06-23 15:57:24 【问题描述】:

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

[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');
        );
    

谢谢 ;)

【问题讨论】:

阅读 laravel 文档,我看到:"以下列类型不能“更改”:char、double、enum、mediumInteger、timestamp、tinyInteger、ipAddress、json、jsonb、macAddress、 mediumIncrements、morphs、nullableMorphs、nullableTimestamps、softDeletes、timeTz、timestampTz、timestamps、timestampsTz、unsignedMediumInteger、unsignedTinyInteger、uuid。" 但我不是在尝试改变列,而是在尝试创建它。 【参考方案1】:

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

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

在这里引用:

这对我在 laravel 5.2 中的学说/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 的类型系统由享元组成,这意味着 任何给定类型只有一个实例。另外类型做 不包含状态。这两种假设都使工作变得相当复杂 使用开发人员经常使用的 Enum 类型的 MySQL。 将枚举与未调整的 Doctrine 2 应用程序一起使用时,由于未知,您将从 Schema-Tool 命令中收到错误 数据库类型“枚举”。默认情况下,Doctrine 不映射 MySQL 枚举 类型为 Doctrine 类型。这是因为枚举包含状态(它们的 允许的值),而 Doctrine 类型则不允许。

从技术上讲,这是可以解决的。见here。但这与 Laravel 所基于的 symfony 密切相关。


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

目前不支持重命名表中也有枚举类型列的任何列。


虽然这不是一个答案,但我希望它能为您指明正确的方向,或者至少让您了解您所面临的问题。


更多相关问题:

How to enable ENUMs in Symfony 2 / Doctrine

Laravel 5.1 Unknown database type enum requested

【讨论】:

【参考方案2】:

在包含 ENUM 类型的迁移文件中,添加一个构造方法,其内容如下:

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

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

【讨论】:

以上是关于Laravel 5.4 迁移 ENUM 在 MySQL 中失败的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5.4 迁移问题

Laravel 5.4 迁移错误 [42501]

使用迁移 Laravel 5.4 更新列

markdown Laravel 5.4:从gulp迁移到webpack

laravel 5.4 迁移错误:150“外键约束格式不正确”

laravel 迁移文件中修改含有enum字段的表报错解决方法