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

Doctrine2 PHP Discussion :

Problème flush pour changer un id


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 17
    Par défaut Problème flush pour changer un id
    Bonjour à tous,

    J'ai un objet Adresse qui a un attribut rue, et une ManyToOne Ville.

    J'aimerais, lorsqu'on ajoute une Ville qui existe déjà, l'attribut ville change dans Adresse.

    Je m'explique :
    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
     
    if($piste->getPersonne()->getAdresse()->getVille()->getLibelle() != null)
                {
                    // on récupére tous les villes de la base pour comparer si la ville existe déjà
                    $villes = $this->em->getRepository('IcmeMainBundle:Ville')->findAll();
     
                    foreach($villes as $v)
                    {                    
                        if($v->getLibelle() == $piste->getPersonne()->getAdresse()->getVille()->getLibelle()
                                && $v->getCodepostal() == $piste->getPersonne()->getAdresse()->getVille()->getCodepostal()) // si la ville existe déjà en base, on l'affecte
                        {  
                            $piste->getPersonne()->getAdresse()->setVille($v);
                        }
                    }
                }
    Ici je teste si la ville saisie existe déjà dans ma base de données, si oui, je fais un setVille de cette ville.

    Exemple, si j'ai Lille qui est la ville actuelle, que je modifie par Paris, et que Paris existe déjà, côté base de données, l'id idVille dans la table Adresse prend l'id de la ville Paris mais, dans la table ville, la ville Lille prend quand même Paris en valeur au moment du flush.

    Comment puis-je fais pour mettre à jour l'id sans mettre à jour le libellé de la ville ?

    Merci d'avance.

    Cordialement.

  2. #2
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 321
    Par défaut
    Salut,

    Perso, j'aurais deux solutions :

    1) tu récupères sur le site de l'INSEE, je crois, ou autre, la liste de toutes les communes de France, que tu intègres dans ton entité Ville. Du coup, elle ne sera là que pour donner une info à l'entité Adresse. En cas de changement après un enregistrement, je ferais juste un update.

    2) En cas de changement de la ville. Test si la ville existe :
    si non, création d'une nouvelle ville, avec l'adresse dans les entités ville et adresse.
    Si oui, tu récupères l'ID de la nouvelle ville via un FindByXXX le nom de la ville ouis ensuite un update de ta table adresse avec l'id trouvé.

    Perso, je prendrais la première solution. Premièrement, tu te retrouves avec les 36000 communes de france et le code postal et ce n'est pas super lourd en BDD.
    Deuxièrement, tu n'as pas à gérer ce pb de savoir si telle ou telle ville existe. Tu la récupère de l'entité Ville et tu intègre son ID dans Adresse.

    Tu vois ce que je veux dire?

  3. #3
    Membre averti
    Inscrit en
    Août 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 17
    Par défaut
    Oui je vois parfaitement ce que tu veux dire.
    J'avais déjà pensé à cette solution mais je n'ai pas choisi de stocker la liste de toutes les communes de France. De plus, si je viens à entrer une commune à l'étranger, c'est impossible.

    Enfin, j'ai ce problème non seulement pour les villes, mais aussi pour d'autres entités.

    Pour ce qui est de ta 2ème solution, c'est un peu celle que je fais actuellement.
    Je teste si la ville existe, si oui, je la récupère pour la mettre dans adresse.

    Il doit bien y avoir un moyen de ne persister que l'idVille de la table adresse, sans persister la ville elle-même.

  4. #4
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 321
    Par défaut
    je comprends ta position. Personnellement j'essaie de faire en sorte que les utilisateurs aient le moins possible de 'droits'. Imagines qu'ils fassent simplement une erreur genre parRis au lieu de paris ou Marseille avec un S. Je ne te parles même pas des villes avec des noms composées (donc avec des "-"). Tu retrouves avec deux villes puisqu 'elles n'existe pas dans ta base.

    la solution ne serait pas d'éviter le cascade={"persist"} dans ta liaison, ce qui t'oblige à gérer séparément les infos sur la ville et les infos sur l'adresse.

  5. #5
    Membre averti
    Inscrit en
    Août 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 17
    Par défaut
    A l'heure actuelle, j'effectue mon test sur le couple ville, code postal.

    Mais bon au final, je pense que je vais partir sur la solution d'entrer les 36000 communes de France en base...

  6. #6
    Membre averti
    Inscrit en
    Août 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 17
    Par défaut
    Voilà au final, j'ai adapté la solution d'enregistrer toutes les communes de France en base.

    Mais comme je l'avais prévu, j'ai le même problème sur une autre entité. Un contact est affecté à un département (ex : logistique, informatique...). Dans chaque société, il existe de nombreux départements, et je ne peux les lister dans une liste déroulante car ils varient toujours.

    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
     
    if($contact->getDepartement()->getNom() != null)
            {
                // on récupére tous les départements de la base pour comparer si le département existe déjà
                $departements = $this->em->getRepository('IcmeGrcBundle:Departement')->findAll();
     
                foreach($departements as $d)
                {                    
                    if($d->getNom() == $contact->getDepartement()->getNom()) // si le département existe déjà en base, on l'affecte
                    {  
                        $contact->setDepartement($d);
                    }
                }
            }
            $this->em->persist($contact->getDepartement());
    Ici, comme précédemment avec les villes, le contact prend l'id du département comme je le souhaite, mais persiste quand même ce département pour lui mettre le nouveau nom, ce qui fait que je me retrouve avec deux départements du même nom...

    N'y-a-t-il pas moyen d'utiliser une fonction comme detach ?



    EDIT :
    J'ai finalement trouvé la solution grâce à un detach et quelques modifications. Voici mon code :

    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
     
     
    $this->em->detach($contact->getDepartement()); 
            if($contact->getDepartement()->getNom() != null)
            {
                // on vérifie si un département portant ce nom existe déjà en base
                $departement = $this->em->getRepository('IcmeGrcBundle:Departement')->findByNom($contact->getDepartement()->getNom());    
     
                if(count($departement)!=0 && $departement[0]!=null)
                {
                    $contact->setDepartement($departement[0]);
                }
                else
                {
                    $newDepartement = new Departement();
                    $newDepartement->setNom($contact->getDepartement()->getNom());
                    $contact->setDepartement($newDepartement);
                }
            $this->em->persist($contact->getDepartement());
            } 
            else
                $contact->setDepartement(null);

Discussions similaires

  1. DateTime :: problème pour changer une heure
    Par olivier1209 dans le forum C#
    Réponses: 4
    Dernier message: 28/01/2008, 09h42
  2. Problème avec les Jlist pour changer :)
    Par catwomanette dans le forum NetBeans
    Réponses: 4
    Dernier message: 04/01/2007, 09h44
  3. [vb2005] problème pour changer de tabpage
    Par marc_dd dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/10/2006, 15h11
  4. Problème pour changer les cartes d'un CardLayout
    Par vallica dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 29/11/2005, 14h38
  5. Problème pour changer la forme du curseur
    Par Amara dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 18/05/2005, 11h37

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