我在我的一张桌子中使用ENUM类型,但是Doctrine并不喜欢它。所以我做了我的研究,发现这个topic基本上是在谈论它。在Doctrine项目的这个other文档中,还讨论了它和两种可能的解决方案。我将使用第一个但是:
假设这个代码应该去哪里?
$conn = $em->getConnection();
$conn->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
如果我想在显示带有这些值的SELECT时如何处理来自Forms的内容?
答案 0 :(得分:5)
关于这个doc,您需要将这些行添加到您的配置中:
# app/config/config.yml
doctrine:
dbal:
connections:
default:
// Other connections parameters
mapping_types:
enum: string
对于表单,我会添加一个帮助器,如getPossibleEnumValues
,并使用它来填充构建器中的选项:
$builder->add('enumField', 'choice', array(
'choices' => $entity->getPossibleEnumValues(),
));
答案 1 :(得分:5)
你不应该使用枚举(出于很多原因,你可以在谷歌或here找到),但如果你绝对想要使用枚举而不是与另一个表的关系,最好的方法是模仿枚举行为像这样:
<?php
/** @Entity */
class Article
{
const STATUS_VISIBLE = 'visible';
const STATUS_INVISIBLE = 'invisible';
/** @Column(type="string") */
private $status;
public function setStatus($status)
{
if (!in_array($status, array(self::STATUS_VISIBLE, self::STATUS_INVISIBLE))) {
throw new \InvalidArgumentException("Invalid status");
}
$this->status = $status;
}
}
答案 2 :(得分:1)
您可以创建新的学说类型。请参阅有关该文档的文档:http://docs.doctrine-project.org/en/2.0.x/cookbook/mysql-enums.html#solution-2-defining-a-type
创建此类型后,您只需使用doctrine bundle配置
进行注册即可# app/config/config.yml
doctrine:
dbal:
types:
your_enum: YourApp\DBAL\YourEnum
然后你可以在你的实体上使用它,就像任何其他类型:)。