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

ORM PHP Discussion :

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


Sujet :

ORM PHP

  1. #1
    Membre du Club
    Inscrit en
    janvier 2012
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : janvier 2012
    Messages : 86
    Points : 44
    Points
    44
    Par défaut Doctrine ne détecte pas les modifications dans un champ date
    Bonjour à tous.

    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;
        }
     
        // ...
    }
    La commande est très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class SendMailRemindOnlineSessionsCommand extends ContainerAwareCommand
    {
          protected function execute(InputInterface $input, OutputInterface $output)
        {
                $this->getContainer()->get('my.app.helper.RemindHelper')->processAll();
        }
    }
    Le code métier est donc dans le helper :

    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
    namespace My\AppBundle\Helper;
     
    class RemindHelper {
     
        /**
         * @var EntityManager
         */
        protected $entityManager;
     
        /**
         * @var  InscriptionRepository
         */
        protected $inscriptionRepository;
     
        public function processAll()
        {
            /** @var Inscription[] $list */
            $list = $this->inscriptionRepository->findInscriptionsWithFlag1HNULL();
     
            foreach ($list as $i => $inscription) {
                $inscription->setFlag1H(new \DateTime());
                //$inscription->setState('FOO');
            }
            $this->entityManager->flush();
        }
    }
    Si je laisse le code tel quel mes inscriptions ne sont pas modifiés.
    Si je décommente la ligne "//$inscription->setState('FOO');" alors les attributs state ET flag1H seront modifiés !

    Merci pour votre aide....

  2. #2
    Membre du Club
    Inscrit en
    janvier 2012
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : janvier 2012
    Messages : 86
    Points : 44
    Points
    44
    Par défaut
    J'ai simplifié mon code en mettant tous dans la commande.

    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
    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 :

    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 :

    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 ?

    Merci pour votre aide.

  3. #3
    Membre du Club
    Inscrit en
    janvier 2012
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : janvier 2012
    Messages : 86
    Points : 44
    Points
    44
    Par défaut
    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.

  4. #4
    Membre du Club
    Inscrit en
    janvier 2012
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : janvier 2012
    Messages : 86
    Points : 44
    Points
    44
    Par défaut
    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

  5. #5
    Membre du Club
    Inscrit en
    janvier 2012
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : janvier 2012
    Messages : 86
    Points : 44
    Points
    44
    Par défaut
    J'ai visiblement ouvert une discussion sur mon problème au mauvais endroit !
    Je me permet de la reposter là bas : http://www.developpez.net/forums/d15...e/#post8536761

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

Discussions similaires

  1. [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
  2. 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
  3. Réponses: 4
    Dernier message: 31/05/2007, 10h48
  4. Réponses: 2
    Dernier message: 19/02/2006, 12h22
  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