这很简单,但不起作用。我们在脚本的底部有
$oMan = $this->getContainer()->get('doctrine')->getManager();
// add entry of calling
$oLastCall = new CronLastCall();
$oLastCall->setType('key');
$oMan->persist($oLastCall);
$oMan->flush();
创建数据库后,我们插入数据库,然后做一些可能需要几分钟时间的事情。那就叫这个吧。
$oLastCall->setDateEnd(new DateTime('now'));
$oMan->flush();
在此之后-从方法\action中存在。因此,关于逻辑(以及我阅读的doctrine2手册),创建的实体已经成为"托管"(我们将其持久化),我们可以简单地更新它。(我调用flush(在最后)来更新这个实体,但它不更新。)
麻烦在哪里?
据我所知,您显示的代码没有任何问题。但是,如果$oLastCall
对象在第一个和第二个代码块之间分离,则必须将其重新附加(合并)到管理器,以便它检测第二次刷新的更改。
合并可以通过以下方式完成:
$oLastCallMerged = $oMan->merge($oLastCall);
$oLastCallMerged->setDateEnd(new DateTime('now'));
$oMan->flush();
您也可以使用以下代码检查对象的状态(MANAGED/NEW/DETACHED/REMOVED):
$oMan->getUnitOfWork()->getEntityState($oLastCall);
如果这没有帮助(即对象的分离不是你的问题),你需要提供更多关于该代码运行的上下文以及你遇到的任何错误的信息。此代码是控制台命令的一部分还是常规web应用程序控制器的一部分?当在"dev"环境中运行它时,您会得到任何输出或错误吗?(检查.../app/logs/dev.log
。)$oLastCall
对象在等待需要几分钟时间的东西时会留在内存中吗?还是从某个地方重新加载它?
顺便说一句,物体不会神奇地自行分离。只有从不同于实体管理器的源加载它们(例如,将它们存储在请求之间的会话中),或者通过调用$oMan->detach($entity)
或$oMan->clear()
显式分离它们时,才会分离它们。
编辑
您还可以通过在更改前后使用$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)));
刷新管理器后,所有对象都将从管理器内部删除。因此,如果以后要更新对象,则需要在刷新之前再次调用persistent。