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 中失败的主要内容,如果未能解决你的问题,请参考以下文章
markdown Laravel 5.4:从gulp迁移到webpack