简短易懂的问题:
如何确定Doctrine PHP Entity
对象是新的?
新 - 我的意思是不在数据库中,而不是"更新"行动。 最重要的是 - 我需要在没有任何查询的情况下检查它:
$manager->findOne($something);
实际上有时候我试图检查" ID为null"但我不是100%确定这种方法是否有效。和其他提示或可能是这个问题的核心 - 我看到了类似的东西:
$manager->getUnitOfWork()->isInIdentityMap($object);
看起来不错,但我无法找到实际功能isInIdentityMap
的内容。
是坚持还是删除是真的吗?当这个函数说真和假?
//EDIT
我需要检测第一次创建的实体对象 - 仅存在于php中但不存在于数据库中。当然,从数据库加载以应用更新的实体对我来说并不新鲜 - 例如:
创建Comment
对象时,需要增加commentCounter
,但只有在第一次刷新此注释时才会增加它。
更新或删除现有评论时,您不想增加它。
如何检查评论是否为新,计数器应该递增。
请在答案中解释为什么您的方法好/更好
答案 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事件。应该注意的是,此事件仅在实体的初始持久性时触发(即,在未来的更新中不会触发)。