我是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');
}
他们都没有奏效。我仍然有同样的错误...
非常感谢任何帮助!
答案 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;