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"
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';";