5

我在我的一张表中使用 ENUM 类型,但 Doctrine 不太喜欢它。所以我做了我的研究,发现这个话题基本上是在谈论它。在Doctrine 项目的另一个文档中也谈到了它和两种可能的解决方案。我将使用第一个,但是:

  1. 这段代码应该去哪里?

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

  2. 稍后当我想显示带有这些值的 SELECT 时,如何从 Forms 处理这个问题?

4

3 回答 3

7

关于此文档,您需要将这些行添加到您的配置中:

# app/config/config.yml
doctrine:
    dbal:
        connections:
            default:
                // Other connections parameters
                mapping_types:
                    enum: string

对于表单,我会添加一个类似的助手getPossibleEnumValues并使用它来填写构建器中的选项:

$builder->add('enumField', 'choice', array(
    'choices' => $entity->getPossibleEnumValues(),
));
于 2013-08-06T07:58:52.583 回答
6

您不应该使用 enum(出于多种原因,您可以在 google 或此处找到),但是如果您绝对想使用 enum 而不是与另一个表的关系,最好的方法是模拟这样的 enum 行为:

<?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;
    }
}
于 2013-08-06T08:00:27.543 回答
1

您可以创建一个新的学说类型。请参阅相关文档:http: //docs.doctrine-project.org/en/2.0.x/cookbook/mysql-enums.html#solution-2-defining-a-type

一旦你创建了这个类型,你只需要使用教义捆绑配置注册它

# app/config/config.yml
doctrine:
    dbal:
        types:
            your_enum: YourApp\DBAL\YourEnum

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

于 2014-07-03T15:37:05.537 回答