Synfony 2.8-не удается зарегистрировать тип перечисления

Я новичок в разработке php и пытаюсь создать свое первое приложение с помощью symfony.

Я создал описание модели с помощью файлов YAML, но не могу избавиться от этой ошибки при попытке обновить БД :

[DoctrineDBALDBALException] запрошен неизвестный тип столбца «enum».

Я попытался добавить следующую конфигурацию в config.yml:

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

Я также попытался добавить следующие инструкции в мой класс bundle:

    public function boot()
{
    $em = $this->container->get('doctrine')->getEntityManager();
    $platform = $em->getConnection()->getDatabasePlatform();
    $platform->registerDoctrineTypeMapping('enum', 'string');
}

Никто из них не работал. У меня все та же ошибка…

Любая помощь будет очень признательна!

2 ответа

  1. Я думаю, что я испортил свое определение сущности…
    Я использовал ‘enum’ в качестве типа сущности, и это, вероятно, причина, по которой он не работал, так как он не является типом по умолчанию в doctrine dbal. Не могу вспомнить, зачем я это сделал.
    Я использовал это вместо: https://github.com/fre5h/DoctrineEnumBundle

  2. При необходимости можно добавить пользовательские типы доктрины DBAL. Но вам придется создать один класс типа для каждого другого типа SET() или ENUM ().

    Вот как я сделал мой пользовательский набор() типов. Вы можете сделать что-то подобное для ENUM. Данный код можно было бы усовершенствовать и дальше, но пока этого достаточно.

    app / config / config.yml

    # Doctrine Configuration
    doctrine:
        dbal:
            types:
                period_set:  Acme\AcmeBundle\DBAL\PeriodSetType
    

    src/Acme/AcmeBundle/DBAL / PeriodSetType.РНР

    <?php
    
    namespace Acme\AcmeBundle\DBAL;
    
    use Acme\AcmeBundle\DBAL\MySQLSetType;
    
    
    class PeriodSetType extends MySQLSetType {
    
        protected $name = 'period_set';
        protected $values = ['second', 'minute', 'hour', 'day', 'weekday', 'month', 'year'];
    }
    

    src/Acme/AcmeBundle/DBAL / MySQLSetType.РНР

    namespace Acme\AcmeBundle\DBAL;
    
    use Doctrine\DBAL\Platforms\AbstractPlatform;
    use Doctrine\DBAL\Types\Type;
    
    
    class MySQLSetType extends Type {
    
        protected $name = 'my_sql_set';
        protected $values = [];
    
        public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
        {
            return sprintf("SET('%s')", implode("','", $this->values));
        }
    
        public function convertToPHPValue($value, AbstractPlatform $platform)
        {
            if ($value === null || $value === '') {
                return [];
            }
            if (strpos($value, ',') === false) {
                return [$value];
            }
            return explode(',', $value);
        }
    
        public function convertToDatabaseValue($value, AbstractPlatform $platform)
        {
            //SF 2.7+ choice field was changed, so it returns string only, set requires array 
            if (is_string($value) and $value != '') {
                $value = (array) $value;
            }
            if (!is_array($value) || count($value) <= 0) {
                return null;
            }
            $diff = array_diff($value, $this->getValues());
            if (count($diff) > 0) {
                throw new \InvalidArgumentException(sprintf(
                        'Invalid value "%s". It is not defined in "%s::$choices"',
                        implode(',', $diff),
                        get_class($this)
                    )
                );
            }
            return implode(',', $value);
        }
    
        public function getName()
        {
            return $this->name;
        }
    
        public function getValues()
        {
            return $this->values;
        }
    }
    

    Entity field @аннотация выглядит следующим образом:

    /**
     * @var string
     *
     * @ORM\Column(type="period_set", nullable=true)
     */
    private $timeResponseUnit = null;