gpt4 book ai didi

php - 协会的 Doctrine postLoad 事件

转载 作者:可可西里 更新时间:2023-11-01 14:03:53 26 4
gpt4 key购买 nike

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

阐明我当前的目标:该实体是一个“位置”并构成嵌套集的一部分。它有一个名称、lft/rgt 值和一个 Id。我对这个实体执行的一项计算量大的任务是获取完整的位置路径并将其显示为文本。例如,对于位置实体“滑铁卢”,我想显示为“滑铁卢|伦敦|英国”。这涉及遍历整个集合(到根节点)。

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

Location 实体不是由我的应用程序直接加载的,它们始终是关系的反面。有了这个想法,以及 doctrine 的 postLoad 事件的事实:

  • 不加载(允许访问)任何相关数据
  • 仅因拥有实体而被解雇

我无法温和地进行这些修改。

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

最佳答案

通过使用实体管理器上的 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);
}
}

关于php - 协会的 Doctrine postLoad 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14500954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com