[英]symfony2: How to remove related entity with doctrine / restrict annotation?
[英]Symfony/Doctrine: Entity “schema” annotation not environment dependent?
我在使功能测试在Symfony3中使用Doctrine运行时遇到麻烦。 我将代码组织成两个捆绑,一个实体管理器需要访问它们,而实体存储在两个不同的MySQL数据库中。 为此,所有实体在其定义中均具有“模式”注释,如下所示:
/**
* @ORM/Table(name="tablename", schema="schema")
* @Entity( ... )
*/
没有此设置,根据我的经验,Doctrine schema:create工具无法在正确的数据库中正确创建实体。 但是,似乎该架构注释不被视为与环境有关。
因此,当我要运行需要加载固定装置的功能测试时,ORMPurger会尝试清除schema.tablename,在此应使用表/模式“ test_schema”。
有什么方法可以保留模式注释,但使其依赖于环境,以便在环境“测试”时使用不同的模式?
编辑:
当您使用不同的Symfony环境时,对实体使用“ schema”注释似乎非常糟糕。 至少与MySQl结合使用时,至少我认为这是原因,因为MySQL实际上并不支持架构。 无论--env设置如何,我所有的Symfony或Doctrine命令都试图从字面上接受模式注释。
我做了一些进一步的挖掘,发现我需要做的事情完美地布置在这里:
因此,我添加了一个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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.