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

时间:2016-12-22 02:33:55

标签: php doctrine-orm symfony unit-of-work

简短易懂的问题:

如何确定Doctrine PHP Entity对象是新的?

- 我的意思是不在数据库中,而不是"更新"行动。 最重要的是 - 我需要在没有任何查询的情况下检查它:

$manager->findOne($something);

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

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

看起来不错,但我无法找到实际功能isInIdentityMap的内容。 是坚持还是删除是真的吗?当这个函数说真和假?

//EDIT

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

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

请在答案中解释为什么您的方法好/更好

2 个答案:

答案 0 :(得分:2)

您可以使用

$entityManager->contains($entity)

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

答案 1 :(得分:0)

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

方法isInIdentityMap

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

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

检查NULL ID

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

也应该工作,它与第一个methid非常相似,但仍然不是100%确定它总是按照我想要的方式工作,另外我们有第一个方法所以...它更好地使用为它准备的功能。

方法contains

$entityManager->contains($entity)

做其他工作的工作。此方法检查实体管理器中的对象,但entityManager已跟踪为任何操作计划的任何持久对象。只要对象不被持久化,此功能就可以提供帮助。

其他方法

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

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

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

prePersist 
  

prePersist - 在执行该实体的相应EntityManager持久操作之前,对于给定实体发生prePersist事件。应该注意的是,此事件仅在实体的初始持久性时触发(即,在未来的更新中不会触发)。