SYMFONY2 / DOCTRINE2-检查实体对象是新的,永不持久



简短而简单的问题:

如何确定该学说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 - 在执行该实体的相应实体持续操作之前,给定实体发生了预科派事件。应该注意的是,此事件仅在实体的初始持久性上触发(即,它不会在将来的更新上触发)。

相关内容

  • 没有找到相关文章

最新更新