【问题标题】:Right way to define and work with ENUM types from Symfony2 and Doctrine2定义和使用 Symfony2 和 Doctrine2 中的 ENUM 类型的正确方法
【发布时间】:2013-08-05 15:50:32
【问题描述】:

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

  1. 这段代码应该放在哪里?

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

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

【问题讨论】:

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


    【解决方案1】:

    关于这个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(),
    ));
    

    【讨论】:

    • 感谢您的信息。但是我如何才能从 FormBuilder 访问 $entity 呢?
    • 有几种方法可以做到这一点。最干净的可能是在这个答案中使用EventListenerstackoverflow.com/questions/11357748/…
    【解决方案2】:

    您不应该使用 enum(出于多种原因,您可以在 google 或 here 上找到),但如果您绝对想使用 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;
        }
    }
    

    【讨论】:

    • 你好,Shady,在使用 Symfony 时也是这样吗(我们不应该使用枚举)?
    • @Aleqxs:事实上,您永远不应该使用 ENUM...除非在某些特殊情况下,例如,如果您使用 ENUM 来存储一周中的几天的值,以帮助人类阅读,那么这是一个有效的用途。但我更喜欢像上面描述的那样模拟 ENUM。
    • 这种风格的一个很好的实现在这里:maxpou.fr/dealing-with-enum-symfony-doctrine
    【解决方案3】:

    您可以创建一个新的学说类型。请参阅相关文档: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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 2011-12-02
      相关资源
      最近更新 更多