刷新無效:在重置Doctrine管理器後的問題
P粉731861241
P粉731861241 2023-08-29 15:07:12
0
1
564
<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>
P粉731861241
P粉731861241

全部回覆(1)
P粉143640496

問題在於resetManager(),並不是所有直接引用實體管理器的服務都會自動更新為新的實例。

updateStatus()方法中,您可以輕鬆檢查實體是否由實體管理器管理。

$uow = $this->getEntityManager()->getUnitOfWork();
if($uow->getEntityState($delayReport) !== UnitOfWork::STATE_MANAGED) {
    // not managed
}

不知道重新指派是否有助於此處,例如$this->getEntityManager()->merge($delayReport)

但是最好避免關閉管理器並在驗證資料之前對其進行驗證。

編輯:

未經測試,如果您將透過Registry取得重置的EntityManager。但這值得一試。

$entityManager = $managerRegistry->getManagerForClass(get_class($delayReport));
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板