【发布时间】:2018-03-09 09:58:13
【问题描述】:
我有一个实体User,它与一个名为Session 的实体存在OneToMany 关系。
到目前为止一切顺利,我可以做$myUser->getSessions() 并获得一个包含与$myUser 相关的所有会话的数组。
Session 还与另一个实体 Moment 建立了 OneToMany 关系。
现在,这个 Moment 实体已移至 Document 中,因为应用程序的该部分现在位于 MongoDB 数据库中,主要是为了解决性能问题。
为了在不重写大量代码的情况下保持应用程序运行,我创建了一个像这样的 Doctrine Listener:
class DoctrineListenerPostLoad
{
private $container;
private $dm;
public function __construct(Container $container, DocumentManager $dm)
{
$this->dm = $dm;
$this->container = $container;
}
public function postLoad(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if($entity instanceof Session)
{
$entity->setMoments(array());
$entity = $args->getEntity();
$moments = $this->dm->getRepository('AppBundle\Document\Moment')->findBy(array('idSession' => $entity->getId()));
$entity->setMoments($moments);
}
}
}
因此,当加载Session 的实例时,侦听器会在 mongodb 数据库中获取与会话相关的时刻。
但是这样做我就失去了教义的懒惰负担。当我需要获取用户的所有会话(但不是 Moments)时,由于数据量很大,我会得到一个 OutOfMemoryException,因为它确实会加载时刻。
我知道我可以“取消绑定”Session 和 Moment 并在需要时执行 DocRepo->findBy(array('idSession' => $entity->getId()),但我将不得不在应用程序上重写很多运行良好的代码。
还有其他方法吗?比如可能在实体中加载 DocumentManager(是的!)或者检查是否在 PostLoad 中调用了 getter ?
谢谢!
【问题讨论】:
标签: orm doctrine symfony-2.8 doctrine-odm