Php 关联的条令加载后事件

Php 关联的条令加载后事件,php,orm,doctrine-orm,Php,Orm,Doctrine Orm,我目前有一个实体,我想在加载时稍微修改一下。此修改将是一次性更改,然后将与实体一起保留在新字段中 为了阐明我当前的目标:实体是一个“位置”,并构成嵌套集的一部分。它有一个名称、lft/rgt值和一个Id。我用这个实体执行的一项计算代价高昂的任务是获取完整的位置路径并将其显示为文本。例如,对于位置实体“Waterloo”,我希望显示为“Waterloo | London | United Kingdom”。这涉及到遍历整个集合(到根节点) 为了降低成本,我在Location实体上创建了一个新字段,

我目前有一个实体,我想在加载时稍微修改一下。此修改将是一次性更改,然后将与实体一起保留在新字段中

为了阐明我当前的目标:实体是一个“位置”,并构成嵌套集的一部分。它有一个名称、lft/rgt值和一个Id。我用这个实体执行的一项计算代价高昂的任务是获取完整的位置路径并将其显示为文本。例如,对于位置实体“Waterloo”,我希望显示为“Waterloo | London | United Kingdom”。这涉及到遍历整个集合(到根节点)

为了降低成本,我在Location实体上创建了一个新字段,可以用这个值标记(并在修改Location(或树中的任何位置)名称时更新)。考虑到我的应用程序处于活动状态,我需要避免将其作为一次性进程运行,因为它会对数据库造成相当大的一次性影响,相反,我希望在加载每个位置(没有该值)时应用此更新。然而,我认为条令的加载后事件机制对于实现这一点来说是完美的

我的应用程序不会直接加载位置实体,它们始终是关系的反面。这就是思想,以及条令的加载后事件:

  • 不加载(允许访问)任何关联数据
  • 仅为拥有实体而激发
我无法温和地进行这些修改


有人对此有任何建议或经验吗?

我可以使用实体管理器上的initializeObject()方法在postLoad事件中加载关联的Location对象

/**
 * Upon loading the object, if the location text isn't set, set it
 * @param \Doctrine\ORM\Event\LifecycleEventArgs $args
 */
public function postLoad(\Doctrine\ORM\Event\LifecycleEventArgs $args)
{
    $this->em = $args->getEntityManager();
    $entity = $args->getEntity();

    if ($entity instanceof \Entities\Location)
    {
        if (is_null($entity->getPathText()))
        {
            $entity->setPathText("new value");
            $this->em->flush($entity);
        }
    } elseif ($entity instanceof {parent Entity})
    {
        $location = $entity->getLocation();
        // This triggers the postLoad event again, but this time with Location as the parent Entity
        $this->em->initializeObject($location);
    }
}

作为个人建议,我不会通过持久层中的奇特逻辑来处理这个问题。相反,构建一个聚合模型,代理对实体的调用,并最终处理父项的获取。这将适合您的服务层