Подтвердить что ты не робот

Как включить ENUM в Symfony 2/Doctrine

При запуске doctrine:mapping:import я получаю сообщение об ошибке:

Неизвестное запрошенное перечисление типа базы данных, Doctrine\DBAL\Platforms\MySqlPlatform может не поддерживать его.

Кажется, мне нужно установить use_native_enum в true как-то. Тем не менее, все документы и сообщения в блогах ссылаются на Symfony < 1.4. Есть ли какие-нибудь решения в Symfony 2?

4b9b3361

Ответ 1

Для проектов Symfony 2 добавьте это в конфигурацию dbal doctrine в app/config.yml:

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

Код, адаптированный из здесь

Затем запустите:

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

Ответ 2

Учитывая, что кулинарная книга Doctrine дает лишь частичные ответы на вопрос о том, как сделать перечисления интерпретируемыми как строки, следующее должно работать независимо от того, как настроена Doctrine.

Ошибка указывает на имя файла: Doctrine\DBAL\Platforms\MySqlPlatform.php - там вы увидите, что список по умолчанию встроен в функцию initializeDoctrineTypeMappings следующим образом:

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

Добавление простой поддержки перечисления для всех пользователей доктрины, независимо от остальной части настройки, просто достигается путем расширения списка:

'enum' => 'string'