如何在 Symfony 2 / Doctrine 中启用 ENUM

Posted

技术标签:

【中文标题】如何在 Symfony 2 / Doctrine 中启用 ENUM【英文标题】:How to enable ENUMs in Symfony 2 / Doctrine 【发布时间】:2012-01-08 21:09:50 【问题描述】:

运行doctrine:mapping:import 时出现错误:

请求的数据库类型枚举未知,Doctrine\DBAL\Platforms\mysqlPlatform 可能不支持。

看来我需要将use_native_enum 设置为true。但是,所有文档和博客文章都引用 Symfony

【问题讨论】:

我想您会在 MySQL Enums 食谱文章中找到您的问题的答案。 但是该代码应该放在哪里以便在doctrine:mapping:import 启动时运行? 有点晚了,但我认为我的回答适合你@umpirsky 【参考方案1】:

对于 Symfony 2 项目,将其添加到 app/config.yml 中的学说 dbal 配置中:

doctrine:
    dbal:
        mapping_types: 
            enum:       string 

我的完整学说配置如下所示:

# Doctrine Configuration
doctrine:
    dbal:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   %database_name%
        user:     %database_user%
        password: %database_password%
        charset:  UTF8
        mapping_types:
            enum: string
            set: string
            varbinary: string
            tinyblob: text

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: true

代码改编自here

然后运行:

app/console doctrine:schema:update --force --dump-sql --ansi

【讨论】:

是的,这行得通,但我想问题是当您执行“php app/console dictionary:schema:update --force”时它会从数据库中删除所有枚举类型 使用 doctrine:migrations:diff 的 Symfony 4 应用程序遇到了这个问题,这个答案仍然对它进行排序:-) 发生在我身上的奇怪事情是,包含enum 的迁移被成功迁移,但之后我无法迁移任何迁移! 我将运行此命令php bin/console make:migration,但它显示如下错误:请求的未知数据库类型枚举,Doctrine\DBAL\Platforms\MySQL57Platform 可能不支持它。 对我来说工作得很好,谢谢伙计【参考方案2】:

考虑到 Doctrine 食谱仅提供了关于如何将枚举解释为字符串的部分答案,无论 Doctrine 是如何配置的,以下内容都应该有效。

错误指向文件的名称:Doctrine\DBAL\Platforms\MySqlPlatform.php - 在那里,您会发现默认列表嵌入在函数initializeDoctrineTypeMappings 中,如下所示:

$this->doctrineTypeMapping = array(
            'tinyint'       => 'boolean',
            'smallint'      => 'smallint',
            'mediumint'     => 'integer',
            'int'           => 'integer',
            (...)

为所有学说用户添加简单的枚举支持,无论设置如何,只需通过以下方式扩展列表即可实现:

'enum' => 'string'

【讨论】:

从“第三方”更改代码是个坏主意。当您想要更新此代码(您想要的:新功能、安全性等)时,您的更改也将被替换。

以上是关于如何在 Symfony 2 / Doctrine 中启用 ENUM的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Symfony 2.0 AJAX 应用程序中将 Doctrine 实体编码为 JSON?

如何使用 Symfony 2.1 从内部控制器获取 Doctrine 实体的实体管理器

如何在 Symfony 中添加 Doctrine 过滤器?

如何在 Doctrine2 (Symfony2) 中按案例排序

如何在 Symfony2,学说 2 中使用 @SqlResultSetMapping?

如何在 Symfony 4 上配置 Doctrine 以使用 yaml 映射