IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Doctrine ne détecte pas les modifications dans un champ date [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut 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 : 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;
        }
     
        // ...
    }
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    Merci pour votre aide.

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut
    Aussi mystérieusement qu'il est apparut, le bug semble avoir disparut !!!
    Peut-être le composer update a-t-il fait une maj de doctrine et que le pb venait d'un bug dans doctrine qui vient d'être corrigé !

    Je laisse la discussion ouverte quelques jours si quelqu’un à une idée de ce qu'il c'est passé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/02/2016, 17h14
  2. [texmaker] les modif dans ma biblio ne sont pas pris en compte
    Par membreComplexe12 dans le forum Bibliographies - Index - Glossaires
    Réponses: 4
    Dernier message: 09/09/2011, 10h54
  3. Afficher les milièmes dans un champs Date Heure
    Par zooffy dans le forum ASP.NET
    Réponses: 8
    Dernier message: 27/07/2007, 14h51
  4. Réponses: 4
    Dernier message: 31/05/2007, 10h48
  5. [C#] Comment empecher les modification dans un DataGrid ?
    Par layate dans le forum Windows Forms
    Réponses: 5
    Dernier message: 06/06/2005, 17h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo