搜尋

首頁  >  問答  >  主體

刷新無效:在重置Doctrine管理器後的問題

<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粉731861241P粉731861241451 天前566

全部回覆(1)我來回復

  • P粉143640496

    P粉1436404962023-08-30 13:15:44

    問題在於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));
    

    回覆
    0
  • 取消回覆