从Symfony2和Doctrine2定义和使用ENUM类型的正确方法

时间:2013-08-05 15:50:32

标签: symfony doctrine-orm symfony-forms symfony-2.3

我在我的一张桌子中使用ENUM类型,但是Doctrine并不喜欢它。所以我做了我的研究,发现这个topic基本上是在谈论它。在Doctrine项目的这个other文档中,还讨论了它和两种可能的解决方案。我将使用第一个但是:

  1. 假设这个代码应该去哪里?

    $conn = $em->getConnection();
    $conn->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');

  2. 如果我想在显示带有这些值的SELECT时如何处理来自Forms的内容?

3 个答案:

答案 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

然后你可以在你的实体上使用它,就像任何其他类型:)。