- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在 onFlush
事件中使用的 \Doctrine\ORM\UnitOfWork::getScheduledEntityDeletions
有一个奇怪的问题
foreach ($unitOfWork->getScheduledEntityDeletions() as $entity) {
if ($entity instanceof PollVote) {
$arr = $entity->getAnswer()->getVotes()->toArray();
dump($arr);
dump($entity);
dump(in_array($entity, $arr, true));
dump(in_array($entity, $arr));
}
}
结果如下:
因此我们看到该对象指向与原始实例不同的实例,因此 in_array
在使用棒比较时不再产生预期的结果(又名 ===
).此外,\DateTime
对象指向不同的实例。
我找到的唯一可能的解释如下(source):
Whenever you fetch an object from the database Doctrine will keep a copy of all the properties and associations inside the UnitOfWork. Because variables in the PHP language are subject to “copy-on-write” the memory usage of a PHP request that only reads objects from the database is the same as if Doctrine did not keep this variable copy. Only if you start changing variables PHP will create new variables internally that consume new memory.
但是,我没有做任何更改(甚至 created
字段也保持原样)。在实体上执行的唯一操作是:
\Doctrine\ORM\EntityRepository::findBy
(从数据库获取)\Doctrine\Common\Persistence\ObjectManager::remove
(删除计划)$em->flush();
(触发与DB同步)这让我认为(我可能是错的)Doctrine 的更改跟踪方法与我遇到的问题无关。这让我想到了以下问题:
\Doctrine\Common\Collections\Collection::contains
使用 in_array
进行严格比较)或集合中的哪些项目计划删除?最佳答案
问题是,当您告诉 doctrine 删除实体时,它会从身份映射 (here) 中删除:
<?php
public function scheduleForDelete($entity)
{
$oid = spl_object_hash($entity);
// ....
$this->removeFromIdentityMap($entity);
// ...
if ( ! isset($this->entityDeletions[$oid])) {
$this->entityDeletions[$oid] = $entity;
$this->entityStates[$oid] = self::STATE_REMOVED;
}
}
当您执行 $entity->getAnswer()->getVotes()
时,它会执行以下操作:
在删除实体之前尝试调用 $entity->getAnswer()->getVotes()
。如果问题消失了,那么我是对的。当然,我不会建议将此 hack 作为解决方案,只是为了确保我们了解引擎盖下发生的事情。
UPD 而不是 $entity->getAnswer()->getVotes()
您可能应该为所有投票执行 foreach,因为延迟加载。如果你只是调用 $entity->getAnswer()->getVotes()
,Doctrine 可能不会做任何事情,并且只会在你开始遍历它们时加载它们。
关于php - onFlush 中的计划实体是不同的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41102378/
我尝试使用 onFlush Doctrine 中的事件以持久化一个新实体,但在尝试持久化时会导致无限循环。这是我在监听器中所做的: $countusers = $em->getRepository('
我想为我的学说模型添加一个安全层。为了能够在 SQL 级别的原则过滤器中添加权限检查,我必须维护一些数据库表,其中包含为每个实体计算的访问控制 token 的缓存。 现在我必须更新这些表,在某些情况下
我在 onFlush 事件中使用的 \Doctrine\ORM\UnitOfWork::getScheduledEntityDeletions 有一个奇怪的问题 foreach ($unitOfWor
您好,我有一个 onFlush 监听器: getEntityManager(); $uow = $em->getUnitOfWork(); foreach ($uow-
考虑以下模式: [Work] id tags ManyToMany(targetEntity="Tag", inversedBy="works", cascade={"persist"}) [Tag]
我正在尝试使用 KnpSnappyBundle 生成 Pdf 并在生成我的比尔实体时保存原则中的位置。 为此,我需要打样服务,但我无法进入实体内部。 我读入了 EventListener 并试图让它工
我正在尝试实现一项功能,让用户指定其相互状态并选择另一个用户,就像 Facebook 中的用户一样。 我的数据库架构如下: UserInfo 实体: class UserInfo { /**
我有这个实体: apples = new \Doctrine\Common\Collections\ArrayCollection(); $this->pigs = new \Doct
我已经为 Doctrine onFlush 事件监听器创建了一个服务。在这个监听器中,我想引用我在另一个 服务中的一个常用函数来检查实体的快捷路径。 other 服务使用实体管理器来执行此操作,因此该
我可以在 Doctrine2 的 onFlush eventListerner 中访问更新的文档。我想要完整的旧文档以旧状态将其存储在其他地方。 public function onFlush(
我有一个 1:m Subitem 之间的关系和 SubitemColor .现在我想在 onFlush 中保存一些数据修改 SubitemColor 的一些数据.问题:执行 Controller 时,
我是一名优秀的程序员,十分优秀!