Je cherche à actualiser l'Etat d'instance de Sortie de ma base de donnée périodiquement grâce au scheduler de symfony

classe executée par le scheduler:

#[AsCronTask('*/1 */1 * * *',timezone:"EUROPE/PARIS")]
final class Historiser
{
    public function __construct (private EntityManagerInterface $entityManager) {

    }
    public function __invoke():string {
        $em=$this->entityManager;
        $sortieRepository=$em->getRepository(Sortie::class);
        $etatHistorise=$em->getRepository(Etat::class)->findOneBy(['libelle'=>'Historisée']);
        $sortiesAHistoriser=$sortieRepository->findSortiesAHistoriser();

        foreach($sortiesAHistoriser as $sortie){
            var_dump($sortie->getNom());
            var_dump($sortie->getEtat()->getLibelle());
            $sortie->setEtat($etatHistorise);
            $em->persist($sortie);
        }
        $em->flush();
        $sortiesAHistoriser=$sortieRepository->findSortiesAHistoriser();
        foreach($sortiesAHistoriser as $sortie) {

            var_dump($sortie->getNom());
            var_dump($sortie->getEtat()->getLibelle());
        }

        return "ok";
    }
}

Resultat de l'invite de commande:
12:26:00 INFO      [messenger] Received message Symfony\Component\Scheduler\Messenger\ServiceCallMessage ["class" => "Symfony\Component\Scheduler\Messenger\ServiceCallMessage"]
D:\wamp64\www\boomParty\src\Scheduler\Handler\Historiser.php:27:
string(12) "A historiser"
D:\wamp64\www\boomParty\src\Scheduler\Handler\Historiser.php:28:
string(7) "Passée"
D:\wamp64\www\boomParty\src\Scheduler\Handler\Historiser.php:27:
string(21) "A historiser Annulée"
D:\wamp64\www\boomParty\src\Scheduler\Handler\Historiser.php:28:
string(8) "Annulée"
D:\wamp64\www\boomParty\src\Scheduler\Handler\Historiser.php:36:
string(12) "A historiser"
D:\wamp64\www\boomParty\src\Scheduler\Handler\Historiser.php:37:
string(11) "Historisée"
D:\wamp64\www\boomParty\src\Scheduler\Handler\Historiser.php:36:
string(21) "A historiser Annulée"
D:\wamp64\www\boomParty\src\Scheduler\Handler\Historiser.php:37:
string(11) "Historisée"
12:26:00 INFO      [messenger] Message Symfony\Component\Scheduler\Messenger\ServiceCallMessage handled by Symfony\Component\Scheduler\Messenger\ServiceCallMessageHandler::__invoke ["class" => "Symfony\Component\Scheduler\Messenger\ServiceCallMessage","handler" => "Symfony\Component\Scheduler\Messenger\ServiceCallMessageHandler::__invoke"]
12:26:00 INFO      [messenger] Symfony\Component\Scheduler\Messenger\ServiceCallMessage was handled successfully (acknowledging to transport). ["class" => "Symfony\Component\Scheduler\Messenger\ServiceCallMessage"]

Ce que je veux

L'Etat des sorties trouvées doit passer à "Historisée dans la base de données

Ce que j'obtiens

L'état des sorties est bien passé en "Historisée", cependant si je relance ma requête de recherche des éléments à Historiser, ces Sorties reviennent avec le bon état "Historisée" mais en base de donnée elle ne sont pas modifiées!

Comme si une copie virtuelle de la base de donnée était crée lors de l'utilisation du scheduler.
Je pensé à l'éventuele caractèristique Transactionnel de l'opération mais je ne reçoit aucune erreur. J'obient: "was handled successfully"

1 réponse


Egreil
Auteur

Problème résolu, le problème ne vennait pas du scheduler mais du mapping du résultat de ma requête

Voici ce que j'avais au début:

        //Création de l'identificateur de la sortie
        $rsm = new ResultSetMappingBuilder($this->getEntityManager());
        //On dit à l'identificateur que la sortie sera de type Sortie
        $rsm->addRootEntityFromClassMetadata('App\Entity\Sortie', 's');
        //Recupération des éléments de la sortie uniquement après jointure avec l'état pour pouvoir récupérer un tableau de Sortie
        $sql="SELECT * FROM sortie as s join  etat  as e on e.id=s.etat_id  WHERE (TIMESTAMPDIFF(MONTH,s.date_heure_debut, NOW()))>=1 AND e.libelle<>'Historisée';";
        $query=$this->getEntityManager()->createNativeQuery($sql,$rsm);
        //Execution de la requête
        $result=$query->getResult();
        return $result;
    }

L'objet en sortie ramenait des attributs provenant de l'Etat et par confusion sur les colonnes id de Etat et Sortie, les Sortie récupérée avaient pour identifiant l'id de l'Etat.
mettre s.* à la place de * à corrigé le problème.

 $sql="SELECT s.* FROM sortie as s join  etat  as e on e.id=s.etat_id  WHERE (TIMESTAMPDIFF(MONTH,s.date_heure_debut, NOW()))>=1 AND e.libelle<>'Historisée';";