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 :

Pas de persist en cascade [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Par défaut Pas de persist en cascade
    Bonjour,

    J'ai un soucis avec mon persist en cascade.
    J'ai une entity Forum avec une relation oneToMany vers l'entity Question qui contient différents attributs dont une date.
    A un moment je modifie (entre autre) les dates de mes questions et je persist mon objet forum
    Et bien il ne persiste pas mes dates dans mes questions ! J'ai même essayé un persist directement sur mes questions, il ne le fait pas... Pourquoi ?
    Merci de votre aide.

    Voici les déclarations :
    entity Forum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        /**
         * @var \Question
         *
         * @ORM\OneToMany(targetEntity="Question", mappedBy="forum",cascade={"persist"})
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="questions")
         * })
         */
        private $questions;
    entity Question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        /**
         * @var \Forum
         *
         * @ORM\ManyToOne(targetEntity="Forum", inversedBy="questions")
         * @ORM\JoinColumn(nullable=false)
         */
        private $forum;
     
        /**
         * @var \Date
         *
         * @ORM\Column(name="startDate", type="date")
         */
        private $startDate;
    Et mon code qui modifie les dates:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                    foreach ($forum->getQuestions() as $question) {
                        // on décale les dates
                        $question->setStartDate($question->getStartDate()->add($interval));
                        // j'ai essayé ça mais ça ne change rien
                        $em->persist($question); $em->flush();
                    }
                    $em->persist($forum);
                    $em->flush();

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,

    au moment du flush, Doctrine calcule quels sont les attributs qui ont changé dans chaque entité pour savoir quel requetes SQL doivent être executés.

    Quand c'est un type primaire (string, integer) pas de probleme.
    lorsque c'est un objet (un objet DateTime ici), les changements sont détecté par référence: est-ce le même objet ou un autre ?
    Les valeurs contenus dans ces objets n'entrent pas en compte dans ce calcul.

    Il faut remplacer l'objet initial par un nouveau:

    exemple 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $newStartDate = clone $question->getStartDate();
    $newStartDate ->add($interval)
    $question->setStartDate($newStartDate);
    exemple 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $question->getStartDate() ->add($interval)
    $question->setStartDate(new \DateTime( $question->getStartDate()->getTimestamp()));

    A l'inverse lorsque l'on utilise un champ date d'un formulaire symfony, les attributs de type DateTime sont toujours remplacés.
    On se retrouve avec le problème inverse, des requêtes SQL inutile qui ne font que remplacer la valeur initiale par la même valeur.

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Par défaut
    Merci arno tu as raison !!!
    Et en même temps j'apprends un truc !
    Merci !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/05/2009, 14h02
  2. Réponses: 2
    Dernier message: 29/04/2009, 18h58
  3. Persist en cascade
    Par stylatone dans le forum Hibernate
    Réponses: 2
    Dernier message: 02/02/2008, 13h23
  4. Réponses: 7
    Dernier message: 07/01/2008, 15h56
  5. Persistance en cascade
    Par aloha dans le forum JPA
    Réponses: 8
    Dernier message: 30/11/2007, 11h39

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