recherche

Maison  >  Questions et réponses  >  le corps du texte

L'actualisation ne fonctionne pas : problème après la réinitialisation de Doctrine Manager

<p>Il y a un problème avec mes données, j'obtiens l'erreur <code>hors plage sur une colonne entière</code> et j'essaie d'empêcher <code>Close Entity Manager</code> fonctionne, car je<code>réinitialiser le gestionnaire</code> dans l'exception</p > <pre class="brush:php;toolbar:false;">fonction publique renouvelerDeliveryTime($delayReport) : void { essayer { $this->delayReportRepository->updateRenewedDeliveryTimeAt($delayReport, 50000000); }attraper (Exception $exception){ // erreur hors de portée $this->managerRegistry->resetManager(); } } fonction publique updateRenewedDeliveryTimeAt($delayReport,$delayDuration) { /*** @var DelayReport $delayReport*/ $delayReport->setDelayDuration($delayDuration); $delayReport->setStatus(DelayReport::STATUS['DONE']); $this->getEntityManager()->flush(); }</pré> <p>Le problème est que j'obtiens une erreur dans mes données, je reçois le message d'erreur <code>hors plage sur une colonne entière</code>, et j'essaie d'empêcher <p> code>gestionnaire d'entités fermées< /code>Continuer à travailler et à cet effet dans l'exception <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']); } fonction publique updateStatus($delayReport, $status) { /*** @var DelayReport $delayReport*/ $delayReport->setStatus($status); $this->getEntityManager()->flush(); }</pré> <p>Le problème est qu'après avoir un autre objet et presque la même opération de base de données, il semble que <code>$this->getEntityManager()->flush()</code> base de données Rien ne se passe. Cela a à voir avec <code>$this->managerRegistry->resetManager()</code></p> <p>Quelle est la solution à ce problème ? </p>
P粉731861241P粉731861241498 Il y a quelques jours589

répondre à tous(1)je répondrai

  • P粉143640496

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

    Le problème estresetManager() que tous les services qui font directement référence au gestionnaire d'entités ne sont pas automatiquement mis à jour vers la nouvelle instance.

    Dans la méthode updateStatus(), vous pouvez facilement vérifier si l'entité est gérée par le responsable de l'entité.

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

    Je ne sais pas si la réaffectation serait utile ici, comme $this->getEntityManager()->merge($delayReport).

    Mais il vaut mieux éviter de fermer le gestionnaire et de valider les données avant de les valider.

    Éditeur :

    Non testé, si vous obtiendrez la réinitialisation d'EntityManager via le registre. Mais ça vaut le coup d'essayer.

    $entityManager = $managerRegistry->getManagerForClass(get_class($delayReport));
    

    répondre
    0
  • Annulerrépondre