如何在 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 实体的实体管理器
如何在 Doctrine2 (Symfony2) 中按案例排序