Symfony2 / Doctrine2 - 检查实体对象是新的,从未持久化

Symfony2 / Doctrine2 - Check Entity Object is new, never persisted

简短而简单的问题:

如何判断Doctrine PHP Entity对象是新的?

New - 我的意思是不在数据库中并且它不是 "update" 操作。 最重要的是 - 我需要无需任何查询即可检查它的方法,例如:

$manager->findOne($something);

实际上有时我尝试检查 "is ID null" 但我不能 100% 确定此方法是否有效。这个问题的其他提示或可能是核心 - 我看到了类似的东西:

$manager->getUnitOfWork()->isInIdentityMap($object);

看起来不错,但我找不到实际功能 isInIdentityMap。 如果它被保留或删除是真的吗?这个函数什么时候说真假?


//EDIT

我需要检测 第一次创建的实体对象 - 仅存在于 php 但不存在于数据库中。当然,从数据库加载实体以应用更新对我来说并不新鲜——例如:

当您创建 Comment 对象时,您需要递增 commentCounter 但它应该仅在您第一次刷新此评论时递增。 您不想在更新或删除现有评论时增加它。 如何检查评论是否为新评论以及计数器是否应该递增。

请在回答中解释为什么你的方法是good/better

您可以使用

$entityManager->contains($entity)

编辑: 根据您的编辑,我建议使用实体侦听器: http://doctrine-orm.readthedocs.io/en/latest/reference/events.html#entity-listeners 因此,当一个实体被持久化时,您不需要在应用程序的许多部分检查该实体是否是新的,您只需设置实体侦听器,它就可以在您创建和持久化实体的任何地方工作。

我检查了一些文档并测试了一些东西,我希望我写的一切都是正确的:

方法isInIdentityMap

$manager->getUnitOfWork()->isInIdentityMap($object);

可能非常适合我的情况,因为它会检查我的对象是否存在于 Identity Map 中,该映射仅存储已刷新的对象或实际上带有 ID 的对象。持久性之前和持久性操作之后的新对象仍然具有 NULL ID,因此它不在此映射中。这样只要对象没有被刷新到数据库中,这个方法就应该有效。 (地图仅包含从数据库加载的对象)

检查NULL ID 的方法

if($obj->getId() == null){
    //code
}

应该也可以工作,它与第一种方法非常相似,但我仍然不能 100% 确定它总是按我想要的方式工作,此外我们还有第一种方法,所以...最好使用为其准备的函数。

方法contains

$entityManager->contains($entity)

工作,但其他情况。此方法检查实体管理器中的对象,但已为任何操作安排的任何持久对象已被 entityManager 跟踪。只有在对象未被持久化时此函数才有用。

其他方法

Unit of work have many other methods,我没有检查所有内容,但似乎我们可以使用以下函数轻松检查许多其他内容:

->scheduleForInsert();
->scheduleForUpdate();
// etc

其他情况 - 使用 Doctrine events 事件:

prePersist 

prePersist - The prePersist event occurs for a given entity before the respective EntityManager persist operation for that entity is executed. It should be noted that this event is only triggered on initial persist of an entity (i.e. it does not trigger on future updates).