Symfony2,Doctrine2,实体插入然后立即更新

时间:2013-12-11 22:07:09

标签: symfony doctrine-orm entity

简单的事情,但不起作用。我们在脚本的底部

    $oMan = $this->getContainer()->get('doctrine')->getManager();

    // add entry of calling
    $oLastCall = new CronLastCall();
    $oLastCall->setType('key');

    $oMan->persist($oLastCall);
    $oMan->flush();

我们在创建它后插入db,然后做一些可能需要几分钟的东西。然后打电话给这个。

    $oLastCall->setDateEnd(new \DateTime('now'));
    $oMan->flush();

在此之后 - 存在于method \ action中。因此,关于逻辑(以及我读过的doctrine2手册)已经创建的实体已经变为“托管”(我们坚持它),我们可以简单地更新它。 (我调用flush(最后)来更新这个实体,但它没有更新。)

麻烦在哪里?

2 个答案:

答案 0 :(得分:1)

据我所知,你所展示的代码没有任何问题。但是如果$oLastCall对象在第一个和第二个代码块之间分离,则必须将它重新连接(合并)到管理器,以便它检测第二个刷新的更改。

合并可以这种方式完成:

$oLastCallMerged = $oMan->merge($oLastCall);
$oLastCallMerged->setDateEnd(new \DateTime('now'));
$oMan->flush();

您还可以使用以下代码检查对象的状态(MANAGED / NEW / DETACHED / REMOVED):

$oMan->getUnitOfWork()->getEntityState($oLastCall);

如果这没有帮助(即,对象的分离不是您的问题),您需要提供有关此代码运行的上下文的更多信息以及您获得的任何错误。此代码是Console Command还是常规网络应用控制器的一部分?在'dev'环境中运行它时,您是否得到任何输出或错误? (检查.../app/logs/dev.log。)$oLastCall对象在等待需要几分钟的内容时是否保留在内存中,或者是否从某处重新加载?

顺便说一句,物体本身并没有神奇地脱离。如果从与实体管理器不同的源加载它们(例如将它们存储在请求之间的会话中),或者通过调用$oMan->detach($entity)$oMan->clear()明确分离它们,它们将仅被分离。 / p>

修改

您还可以通过在更改之前和之后使用$oMan->getUnitOfWork()->getEntityChangeSet($oLastCall)回显变更集来检查Doctrine是否检测到更改,例如:

error_log(json_encode($oMan->getUnitOfWork()->getEntityChangeSet($oLastCall)));
$oLastCall->setDateEnd(new \DateTime('now'));
error_log(json_encode($oMan->getUnitOfWork()->getEntityChangeSet($oLastCall)));

答案 1 :(得分:0)

刷新管理器后,所有对象都将从管理器内部删除。因此,如果您想稍后更新该对象,则需要在刷新之前再次调用persist。