简短而简单的问题:
如何确定该学说PHP Entity
对象是新的?
new - 我的意思是不在数据库中,而不是"更新"操作。最重要的事情 - 我需要办法检查它而没有任何查询:
$manager->findOne($something);
实际上有时我试图检查" IS ID NULL",但我不是100%确定此方法有效。还有这个问题的其他提示或可能的核心 - 我看到了类似的东西:
$manager->getUnitOfWork()->isInIdentityMap($object);
看起来不错,但我找不到实际功能函数isInIdentityMap
。如果持续或删除它是真的吗?当此函数说是正确的吗?
//EDIT
我需要检测创建实体对象首次 - 仅在PHP中存在,但不存在于数据库中。当然,从数据库加载以应用更新的实体对我来说并不是什么新鲜事 - 例如:
创建Comment
对象时,您需要递增commentCounter
,但是仅在第一次冲洗此评论时才应增加。更新或删除现有评论时,您不想将其递增。如何检查该评论是新的,应增加计数器。
请在答案中解释为什么您的方法很好/更好
您可以使用
$entityManager->contains($entity)
编辑:根据您的编辑,我建议使用实体侦听器:http://doctrine-orm.readthedocs.io/en/latest/reference/events.html#entity-listeners因此,当实体持续存在时,您不需要检查应用程序中的许多部分是否是新的,您只能设置实体侦听器,并且在您创建何处并坚持实体。
我检查了一些文档并测试了一些东西,希望我写的一切都是正确的:
方法isInIdentityMap
$manager->getUnitOfWork()->isInIdentityMap($object);
可能非常适合我的情况,因为它检查了我的对象是否存在于身份图中,此映射存储仅冲洗对象或实际与ID
对象。在持久性和持续操作之后的新对象仍然具有NULL
ID,因此在此地图中不在此地图中。这样一来,只要对象没有冲入数据库,该方法就应该起作用。(地图仅包含从数据库加载的对象)
检查NULL
ID
if($obj->getId() == null){
//code
}
也应该工作,它与第一次甲基非常相似,但我仍然不是100%确定它总是按照我想要的,而且我们有第一种方法,所以...最好使用为其准备的功能。
方法contains
$entityManager->contains($entity)
做工作,但对于其他情况。此方法检查Entity Manager中的对象,但是任何持久的对象(计划为任何操作)已通过entityManager
跟踪。只要对象不持久,此功能才能提供帮助。
其他方法
工作单位还有许多其他方法,我没有检查所有方法,但是似乎我们可以使用以下功能轻松检查许多其他内容:
->scheduleForInsert();
->scheduleForUpdate();
// etc
和其他情况 - 使用学说事件:
prePersist
prepersist - 在执行该实体的相应实体持续操作之前,给定实体发生了预科派事件。应该注意的是,此事件仅在实体的初始持久性上触发(即,它不会在将来的更新上触发)。