在Symfony2 / Doctrine2

时间:2015-07-29 19:44:21

标签: php mysql symfony doctrine-orm enums

为了解释我的问题,我尝试了this StackExchange question建议的每个解决方案。

这是给出的错误:

[Doctrine\DBAL\DBALException]
Unknown column type "enumAddressSource" requested. Any Doctrine type t
hat you use has to be registered with \Doctrine\DBAL\Types\Type::addTy
pe(). You can get a list of all the known types with \Doctrine\DBAL\Ty
pes\Type::getTypesMap(). If this error occurs during database introspe
ction then you might have forgot to register all database types for a
Doctrine Type. Use AbstractPlatform#registerDoctrineTypeMapping() or h
ave your custom types implement Type#getMappedDatabaseTypes(). If the
type name is empty you might have a problem with the cache or forgot s
ome mapping information.

此错误与我在尝试任何修复之前收到的错误相同。

这是config.yml文件中的当前Doctrine代码:

doctrine:
    dbal:
        driver:   pdo_mysql
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  UTF8
        mapping_types:
            enum: string
            enumAddressSource: string
            # if using pdo_sqlite as your database driver:
            #   1. add the path in parameters.yml
            #     e.g. database_path: "%kernel.root_dir%/data/data.db3"
            #   2. Uncomment database_path in parameters.yml.dist
            #   3. Uncomment next line:
            #     path:     "%database_path%"

    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true

vendor / doctrine / dbal / lib / Doctrine / DBAL / Platforms / MySqlPlatform.php下的相关代码:

protected function initializeDoctrineTypeMappings()
{
    $this->doctrineTypeMapping = array(
        'tinyint'       => 'boolean',
        'smallint'      => 'smallint',
        ...
        'enum'          => 'string',
        'enumAddressSource' => 'string',
    );

我会尝试接受此处显示的建议:Doctrine Cookbook,但文章没有明确指出要将此代码注入哪个文件(具体参见选项1)。在我看来,显示的代码将被第二个代码示例底部注入的代码所覆盖。

对于数据库中的所有枚举都会发生这种情况。手动更改数据库并不是一个选项。我还能尝试什么?

2 个答案:

答案 0 :(得分:0)

不确定的目的:enumAddressSource:string

不应该枚举:字符串(如前面的行)就足够了吗?

你得到的错误消息基本上是告诉你没有类型叫做" enumAdressSource",因此没有这样的类型可以映射到字符串。你是映射类型,而不是这里的字段。

答案 1 :(得分:0)

错误的原因是嵌套在MySQL数据库列中的注释。我从来没有想过Doctrine会阅读这些评论并尝试解释它们。删除注释修复了问题。我找不到关于这个问题的进一步文件。如果有人有好的来源,请评论(或编辑)这个答案。