Synfony 2.8 -不能注册枚举类型



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

我使用YAML文件创建了我的模型描述,但是当我试图更新DB时,我无法摆脱这个错误:

[Doctrine dbalbalexception]未知列类型"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');
}

它们都不起作用。我仍然得到相同的错误…

任何帮助都将非常感激!

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

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

下面是我如何实现自定义SET()类型的。您可以为ENUM做类似的事情。给定的代码可以进一步改进,但现在已经足够了。

app/config/config.yml

# Doctrine Configuration
doctrine:
    dbal:
        types:
            period_set:  AcmeAcmeBundleDBALPeriodSetType

src/Acme/AcmeBundle/DBAL PeriodSetType.php

<?php
namespace AcmeAcmeBundleDBAL;
use AcmeAcmeBundleDBALMySQLSetType;

class PeriodSetType extends MySQLSetType {
    protected $name = 'period_set';
    protected $values = ['second', 'minute', 'hour', 'day', 'weekday', 'month', 'year'];
}

src/Acme/AcmeBundle/DBAL MySQLSetType.php

namespace AcmeAcmeBundleDBAL;
use DoctrineDBALPlatformsAbstractPlatform;
use DoctrineDBALTypesType;

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
 *
 * @ORMColumn(type="period_set", nullable=true)
 */
private $timeResponseUnit = null;

最新更新