Bonjour à tous.
J'ai visiblement ouvert une discussion sur mon problème au mauvais endroit ! http://www.developpez.net/forums/d15...ons-champ-date
Je me permet de la reposter ici.
J'ai un petit problème avec une entité qui refuse de se mettre à jours.
On gère ici des inscriptions à des formations.
Une tache planifiée est chargée d'envoyer un mail de rappel une heure avant le début de la formation.
On enregistre la date de l'envoie de ce mail dans l'inscription pour éviter de notifier plusieurs fois l'utilisateur.
Voici mon entité Inscription :
Et ma commande qui va modifier mes inscriptions (version simplifié)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 namespace My\AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Table() * @ORM\Entity(repositoryClass="Pileje\AppBundle\Repository\ParticipantTrainingLocationRepository") */ class Inscription { /** * @var integer * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @var string * @ORM\Column(type="string", length=20) */ protected $state; /** * @var \DateTime * @ORM\Column(type="datetime", nullable=true)) */ protected $flag1H = null; // ... /** * @param \DateTime $flag1H */ public function setFlag1H(\DateTime $flag1H) { $this->flag1H = $flag1H; return $this; } // ... }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 class SendMailRemindOnlineSessionsCommand extends ContainerAwareCommand protected function execute(InputInterface $input, OutputInterface $output) { /** @var EntityManager $em */ $em = $this->getContainer()->get('doctrine.orm.entity_manager'); /** @var InscriptionRepository $ir */ $ir = $this->getContainer()->get('my.repository.inscription'); /** @var Inscription $i */ $i = $ir->find(809); // $i est une Inscription (Voir l'entity dans mon message précédent) sur flagH1 est a NULL et sont state est 'active'. $d = $i->getFlag1H() ? $i->getFlag1H()->format('H:i.s') : 'No_date'; $output->writeln("Inscription ID:{$i->getId()} H1:{$d} S:{$i->getState()} "); $i->setFlag1H(new \DateTime()); //$i->setState('foo_'.date('H:i.s')); // Cette ligne sera dé-commenté puis re-commenté dans l'exemple expliqué en dessous. $em->flush(); } }
Lorsque j'exécute la commande la première fois :
La commende affiche l'état de mon Inscription avant sa modification.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Inscription ID:809 H1:No_date S:active
Je la re-exécute :
Problème : on constate que l'inscription n'a pas été modifiée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Inscription ID:809 H1:No_date S:active
Je dé-commente la ligne //$i->setState('foo_'.date('H:i.s'));
Je re-exécute deux fois :
L'entity-manager à bien détecter que l'objet a été modifié est a enregistré les deux modifications en base.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Inscription ID:809 H1:10:53:26 S:foo_10:53.26
Si je re-exécute :
Pas de problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Inscription ID:809 H1:10:56:32 S:foo_10:56:32
Je Re commente la ligne $i->setState('foo_'.date('H:i.s'));
Je re-exécute deux fois :
Le champ date a bien été modifié et le champ state est resté intacte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Inscription ID:809 H1:10:59:42 S:foo_10:56:32
ça veut dire que l'entity-manager arrive bien à détecter les modifications dans les champs date. Mais pas le passage de null à une date.
Pourquoi ?
Existe-t-il un moyen de 'forcer' l'enregistrement ?
J'ai évidement essayé d'ajouter un $em->persist($i); mais comme il ne sert a rien ici ça ne résout pas le pb.
Mon problème ressemble à celui-ci : http://stackoverflow.com/questions/1...field/15488230
Mais je ne vois pas comment faire mieux que new \DateTime()
Sur d'autres projets on a pas eu ce problème.
ça viens peut-être de ma conf doctrine ou de mon entité ?
config.yml
Merci pour votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 # Doctrine Configuration doctrine: dbal: driver: pdo_mysql host: "%database_host%" port: "%database_port%" dbname: "%database_name%" user: "%database_user%" password: "%database_password%" charset: UTF8 orm: auto_generate_proxy_classes: "%kernel.debug%" naming_strategy: doctrine.orm.naming_strategy.underscore auto_mapping: true
Partager