Synfony 2.8 - 无法注册枚举类型

时间:2016-09-29 15:20:58

标签: symfony enums

我是php开发新手并尝试使用symfony创建我的第一个应用程序。

我使用YAML文件创建了我的模型描述,但在尝试更新数据库时我无法摆脱此错误:

  

[Doctrine \ DBALDBALException]未知列类型“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 个答案:

答案 0 :(得分:0)

我想我搞砸了我的实体定义...... 我使用'enum'作为实体类型,这可能是它不起作用的原因,因为它不是doctrine dbal中的默认类型。不记得我为什么这样做了。 我用它来代替:https://github.com/fre5h/DoctrineEnumBundle

答案 1 :(得分:0)

如果需要,您可以添加自定义DBAL原则类型。但是你必须为每个不同的SET()或ENUM()类型创建一个Type类。

以下是我完成自定义SET()类型的方法。您可以为ENUM做类似的事情。鉴于代码可以进一步改进,但现在就足够了。

应用程序/配置/ config.yml

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

的src / Acme公司/ AcmeBundle / DBAL / PeriodSetType.php

<?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.php     

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;
    }
}

实体字段@annotation如下:

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