\Doctrine\ORM\UnitOfWork::getScheduledEntityDeletions使用内部onFlush事件我有一个奇怪的问题
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));
}
}
Run Code Online (Sandbox Code Playgroud)
这是结果:
因此,我们看到该对象指向的是与原始实例不同的实例,因此in_array在使用棒比较(AKA ===)时不再产生预期结果.此外,该\DateTime对象指向不同的实例.
我找到的唯一可能的解释是以下(来源):
每当从数据库中获取对象时,Doctrine将保留UnitOfWork内所有属性和关联的副本.因为PHP语言中的变量受"写入时复制"的影响,所以只从数据库中读取对象的PHP请求的内存使用情况与Doctrine不保留此变量副本的内存使用情况相同.只有当你开始更改变量时,PHP才会在内部创建消耗新内存的新变量.
但是,我没有改变任何东西(即使created字段保持原样).在实体上执行的唯一操作是:
\Doctrine\ORM\EntityRepository::findBy (从DB获取)\Doctrine\Common\Persistence\ObjectManager::remove (安排搬迁)$em->flush(); (触发与DB的同步)这让我想到(我可能错了)Doctrine的变更跟踪方法与我遇到的问题无关.这让我想到以下问题:
\Doctrine\Common\Collections\Collection::contains使用in_array严格比较)或集合中的哪些项目被安排删除?