Doctrine ne détecte pas les modifications dans un champ date
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 :
Code:
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;
}
// ...
} |
Et ma commande qui va modifier mes inscriptions (version simplifié)
Code:
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 :
Code:
Inscription ID:809 H1:No_date S:active
La commende affiche l'état de mon Inscription avant sa modification.
Je la re-exécute :
Code:
Inscription ID:809 H1:No_date S:active
Problème : on constate que l'inscription n'a pas été modifiée.
Je dé-commente la ligne //$i->setState('foo_'.date('H:i.s'));
Je re-exécute deux fois :
Code:
Inscription ID:809 H1:10:53:26 S:foo_10:53.26
L'entity-manager à bien détecter que l'objet a été modifié est a enregistré les deux modifications en base.
Si je re-exécute :
Code:
Inscription ID:809 H1:10:56:32 S:foo_10:56:32
Pas de problème.
Je Re commente la ligne $i->setState('foo_'.date('H:i.s'));
Je re-exécute deux fois :
Code:
Inscription ID:809 H1:10:59:42 S:foo_10:56:32
Le champ date a bien été modifié et le champ state est resté intacte.
ç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
Code:
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 |
Merci pour votre aide.