我是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;