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 :

Problème au flush() [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut Problème au flush()
    Bonsoir,

    J'ai un problème et après une aprèm de recherche aucun moyen de m'en sortir.

    Je vais essayer d'être clair :

    J'ai un objet "Project", un second Objet "Assumption".

    La relation entre Project et Assumption : 1:M

    Matérialisé avec Doctrine ORM en annotation :
    Dans la classe project, le champ "assumptions" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /**
     * @ORM\OneToMany(targetEntity="Assumption", mappedBy="project")
     */
     protected $assumptions;
    Et dans la classe Assumption le champ project :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /**
     * @ORM\ManyToOne(targetEntity="Project", inversedBy="assumptions")
     * @ORM\JoinColumn(name="project_id", referencedColumnName="id")
     */
     protected $project;
    Le problème est que quand j'insère ou modifie un projet via flush(), aucun problème, mais quand j'insère un Assumption en lui passant le projet, tous les champs de ma table excepté l'id auto-généré se mettent à blank...

    Si quelqu'un a déjà eut le problème ou voit quelque chose de choquant dans mes relations...

    Merci d'avance de votre aide.

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    Bonjour,
    je propose mettre un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($tonObjet);exit;
    juste après le flush dans chaque cas , vérifie aussi que cet objet est bien conforme au table (colonne nullable etc ..)

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    Pour que vous ayez le plus d'infos en votre possession je partage aussi le code d'update ainsi que le code où j'appelle cet update (et je sens que c'est ici qu'il doit y avoir un problème ...)

    l'Update :
    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
     
    /**
         * Function to update an assumption in DB
         * @param type $form
         * @param type $id
         */
        public function updateProjectAssumption($form, $id)
        {
            // get the Project from DB
            $em = $this->getDoctrine()->getManager();
            $rep = $em->getRepository('ATSCapacityPlanBundle:Project');
            $project = $rep->find($id); 
            // get assumptions linked to this project
            $assumptions = $project->getAssumptions();
            $i=0;
           // In the form label for each assumption is: assumption1, assumption2 ...
            foreach ($assumptions as $assumption) {
                $i++;
                $assumption->setText($form->get('assumption'.$i)->getData());
                $assumption->setProject($project);
            }
            // Save the Assumption with new datas in DB
            $em->flush();
            $this->confirm = true;
        }
    Et le code de mon action dans mon contrôleur :
    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
    44
    45
    46
    47
    48
    49
    50
    51
     
    /**
         * This action will create a form to display config infos for the selected project
         * User will be able to update it
         * @param Request $request
         * @param type $id
         * @return render
         */
        public function viewAction(Request $request, $id)
        {
            // Get the project selected
            $em = $this->getDoctrine()->getManager();
            $rep = $em->getRepository('ATSCapacityPlanBundle:Project');
            $project = $rep->find($id); // get the Project from DB
            // Get forms to display Config
            $formProjectToDisplay = $this->getFormDisplayProject($id);
            $formProjectToDisplay->handleRequest($request);
            $formSelectAnotherProject = $this->getFormSelectProject();
            $formAssumptions = $this->getFormAssumptions($id);
            $formAssumptions->handleRequest($request);
            $route = 'ats_capacity_plan_configurationview';
            $this->project = $rep->find($id);
     
            if ($formSelectAnotherProject->isValid())// User has clicked on submit and a project is selected
            { 
                $projectSelected = $formSelectAnotherProject->get('projects')->getData();
                $projectId = $projectSelected->getId();
                // execute action to display config
                return $this->redirect($this->generateUrl($route, array('id'=>$projectId)));
            }
            elseif($formAssumptions->isValid())// User has clicked on add assumptions and datas are correct
            {
               //$this->createProjectAssumption($formAssumptions, $project); // Persist infos in DB
               $this->updateProjectAssumption($formAssumptions, $this->project);
               return $this->redirect($this->generateUrl($route, array('id'=>$id)));
            }
            elseif($formProjectToDisplay->isValid())// User has clicked on submit and datas are correct
            {
               $this->updateProjectInformation($formProjectToDisplay, $this->project); // Persist infos in DB
               return $this->redirect($this->generateUrl($route, array('id'=>$id)));
            }
     
            $args = array(
                    'formProjectSelected' => $formProjectToDisplay->createView(),
                    'formChangeProject' => $formSelectAnotherProject->createView(),
                    'formAssumptions' => $formAssumptions->createView(),
                    'confirm' => $this->confirm,  
                    );
            return $this->render('ATSCapacityPlanBundle:Configuration:ConfigurationView.html.twig', 
                $args);
        }
    Pour info j'ai rajouté un cascade persist dans mes deux entités, mais ça ne change rien...
    Je n'ai rien vu de choquant dans le var_dump.

    Merci

  4. #4
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Salut Manumic,

    C'est une histoire de Owning/Inverse Side Doctrine.
    Trois phrases à retenir de la documentation à ce sujet pour ton problème.

    ManyToOne is always the owning side of a bidirectional association.
    OneToMany is always the inverse side of a bidirectional association.
    Doctrine will only check the owning side of an association for changes.
    Concrètement, c'est normal. Deux possibilités, soit tu persistes manuellement tes deux entités, soit tu modifies tes setters / adders pour qu'il fasse le set inverse.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    Citation Envoyé par Nico_F Voir le message
    Salut Manumic,

    C'est une histoire de Owning/Inverse Side Doctrine.
    Trois phrases à retenir de la documentation à ce sujet pour ton problème.



    Concrètement, c'est normal. Deux possibilités, soit tu persistes manuellement tes deux entités, soit tu modifies tes setters / adders pour qu'il fasse le set inverse.

    Merci Nico_F.

    Mais j'ai beau relire et relire, mon mapping me semble correct et je ne vois pas l'erreur aussi flagrante puisse-t-elle être !

    FYI :

    Un projet peut avoir plusieurs Assumptions
    Une assumption n'est reliée qu'à un projet.

    Donc dans la table Assumption, un champ "project_Id" qui mappe vers Id de la table "Project" dans la classe l'attribut est : "project"
    Dans la table Project, pas de champ et dans la classe un attribut 'Assumptions' (qui liste toutes les assumptions où project_Id = id

    Dans la classe Assumption (qui est donc owner ?) on a setProject() & getProject();
    Dans la classe Project ( inverse side ?) on a get Assumptions;

    A me relire tout semble correct ?

    Mes travaux de ce matin ont révélé d'autres comportements bizarre ...

    Si je modifie un projet, tous les champs de toutes les assumptions liées sont mis à null. Si je modifie les assumptions d'un projet, ce sont au contraire tous les champs du projet qui sont mis à null ...

    Je suis vraiment perdu !

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    Si jamais ça peut éclairer une quelconque piste :

    J'ai ce message qui s'affiche au dessus des formulaires que je n'ai pas touchés à chaque fois que je j'en valide un:

    This form should not contain extra fields.

    Merci,

  7. #7
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Le mapping me semble correct également, le problème c'est que toutes tes entités ne sont pas forcément persistées, et qu'il y a un coté de la relation qui ne tient pas du tout compte des relations.

    Ce que je disais c'est que soit tu persistes manuellement tes deux objets :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $em->persist($obj1);
    $em->persist($obj2);
    $em->flush();

    soit tu modifies tes setters

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function addObj($obj)
    {
        $this->objs[] = $obj;
        $obj->setCurrentObj($this);
     
        return $this;
    }

    De cette manière tu persisteras des deux cotés, tu n'auras plus qu'un persist à faire et les données partiront avec ton flush.

    Le deuxième problème (form extra fields) n'a rien à voir, tu devrais ouvrir un autre topic.

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

Discussions similaires

  1. Problème de flush
    Par Valentin.C dans le forum Doctrine2
    Réponses: 1
    Dernier message: 14/08/2013, 11h28
  2. Problème avec Response.Flush
    Par Loki13 dans le forum ASP
    Réponses: 1
    Dernier message: 12/12/2008, 10h36
  3. Problème fonction FLUSH
    Par chreks dans le forum Fortran
    Réponses: 3
    Dernier message: 12/06/2008, 18h20
  4. [PHP-JS] problème avec le flush
    Par bat dans le forum Langage
    Réponses: 4
    Dernier message: 05/10/2005, 15h03
  5. Flush hosts et détection de problème
    Par psychomatt dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/07/2005, 14h39

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