【问题标题】:Symfony/Doctrine: Entity "schema" annotation not environment dependent?Symfony/Doctrine:实体“模式”注释不依赖于环境?
【发布时间】:2017-03-01 13:34:57
【问题描述】:

我无法使用 Doctrine 在 Symfony3 中运行功能测试。 我将代码组织在两个包中,一个实体管理器需要访问这些包,实体存储在两个不同的 MySQL 数据库中。 为了实现这一点,所有实体在其定义中都有一个“模式”注释,如下所示:

/**
 * @ORM/Table(name="tablename", schema="schema")
 * @Entity( ... )
 */

如果没有此设置,根据我的经验,Doctrine schema:create 工具无法在正确的数据库中正确创建实体。 但是看起来,模式注释不被认为是环境相关的。

所以当我想运行需要加载夹具的功能测试时,ORMPurger 会尝试清除 schema.tablename,它应该使用表/模式“test_schema”。

有什么办法可以保留schema注解,但是让它依赖于环境,这样当环境为“test”时,使用不同的schema?

编辑:

当您使用不同的 Symfony 环境时,似乎对实体使用“模式”注释非常糟糕。至少在与 MySQl 一起使用时,至少我认为这就是原因,因为 MySQL 实际上并不支持模式。 无论 --env 设置如何,我都尝试从字面上理解模式注释的每个 Symfony 或 Doctrine 命令。

【问题讨论】:

    标签: annotations doctrine symfony functional-testing


    【解决方案1】:

    我做了更多的挖掘工作,发现我需要做的事情在这里完美地列出:

    Programmatically modify table's schema name in Doctrine2?

    所以我添加了一个 EventListener,它根据使用的 EM 添加正确的架构,因此我不再需要硬编码的架构注释。

    这是我制作的监听器的代码:

    <?php
    
    namespace /* ... */
    
    use Doctrine\ORM\Mapping\ClassMetadata;
    use Doctrine\ORM\EntityManagerInterface;
    use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
    
    class MappingListener
    {
        public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
        {
            /** @var EntityManagerInterface $entityManager */
            $entityManager = $eventArgs->getEntityManager();
            /** @var ClassMetadata $classMetadata */
            $classMetadata = $eventArgs->getClassMetadata();
    
            $database = $entityManager->getConnection()->getDatabase();
    
            $classMetadata->table['schema'] = $database;
        } 
    }
    

    【讨论】:

    • 有效,但编辑架构的正确方法是使用:$classMetadata-&gt;setPrimaryTable(['schema' =&gt; $database]);,因为表属性记录为只读。
    猜你喜欢
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多