当我尝试应用迁移时,出现此错误:
[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');
});
}
}
谢谢;)
答案 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类型列的表中的任何列目前都不支持。
虽然这不是一个答案,但我希望它指出你正确的方向,或者至少让你知道你面临的是什么。
更多相关问题:
答案 1 :(得分:0)
在包含ENUM类型的迁移文件中,添加一个带有以下内容的构造函数方法:
public function __construct() {
// Register ENUM type
DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
}
这在Laravel 5.2中对我有用。您可以尝试在更高级别添加此项,但这对我来说更快:)