刷新无效:在重置Doctrine管理器后的问题
P粉731861241
2023-08-29 15:07:12
<p>我的数据有错误,我收到错误 <code>out of range on a integer column</code> ,我尝试阻止 <code>关闭实体管理器</code> 继续工作,为此我 <code>reset manager</code> in exception</p >
<pre class="brush:php;toolbar:false;">public function renewDeliveryTime($delayReport) : void
{
try {
$this->delayReportRepository->updateRenewedDeliveryTimeAt($delayReport, 50000000);
}catch (\Exception $exception){
// out of range error
$this->managerRegistry->resetManager();
}
}
public function updateRenewedDeliveryTimeAt($delayReport,$delayDuration)
{
/*** @var DelayReport $delayReport*/
$delayReport->setDelayDuration($delayDuration);
$delayReport->setStatus(DelayReport::STATUS['DONE']);
$this->getEntityManager()->flush();
}</pre>
<p>问题是,我在我的数据中遇到了一个错误,我收到了错误信息<code>out of range on a integer column</code>,我试图阻止<code>closed entity manager</code>继续工作,并为此目的在异常中<code>reset manager</code></p>
<pre class="brush:php;toolbar:false;">public function enqueue($delayReport) : void
{
$this->pushInQueueReport($delayReport);
$this->delayReportRepository->updateStatus($delayReport, DelayReport::STATUS['IN_QUEUE']);
}
public function updateStatus($delayReport, $status)
{
/*** @var DelayReport $delayReport*/
$delayReport->setStatus($status);
$this->getEntityManager()->flush();
}</pre>
<p>问题是,在我有另一个对象和几乎相同的数据库操作之后,似乎<code>$this->getEntityManager()->flush()</code>不再起作用,数据库中什么也没有发生。这与<code>$this->managerRegistry->resetManager()</code>有关</p>
<p>这个问题的解决方案是什么?</p>
问题在于
resetManager()
,并不是所有直接引用实体管理器的服务都会自动更新为新的实例。在
updateStatus()
方法中,您可以轻松地检查实体是否由实体管理器管理。不知道重新分配是否有助于此处,例如
$this->getEntityManager()->merge($delayReport)
。但是最好避免关闭管理器并在验证数据之前对其进行验证。
编辑:
未经测试,如果您将通过Registry获取重置的EntityManager。但是这值得一试。