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 d'enregistrement avec une clé unique ? This value is already used


Sujet :

Doctrine2 PHP

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut problème d'enregistrement avec une clé unique ? This value is already used
    Bonsoir, avis au pro de symfony2, je n'arrive pas à enregistrer correctement
    une donnée déjà existant.
    je vais essayer de l'expliquer car c'est pas simple et je mélange un peu les pinceaux.

    voici 3 tables
    Code console : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CONTACT
    ------------
    id|nom|prenom

    Code console : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    METIER
    -------------
    id|actvite
    1|plombier
    2|menusier

    Code console : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CONTACT-METIER
    ---------------------
    id_contact |id_activite

    un contact peut posséder 1 ou plusieurs activités, c'est pour cela que j'ai
    une table contact-metier

    sous le répertoire entité de symfony2 j'ai donc 2 entité
    entité contact
    entité metier

    les 2 entité on donc un relation ManyToMany
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    class Contact
     * @ORM\ManyToMany(targetEntity="Kod\CommercialBundle\Entity\Metier",cascade={"persist"})

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    class Metier
     * @ORM\ManyToMany(targetEntity="Kod\AnnuaireBundle\Entity\Contact",cascade={"persist"})
    j'ai donc un formulaire de contact qui me permet d'ajouter
    plusieurs métiers.

    Pour éviter des doublons dans la table métier j'ai mis une contraint unique dans le nom de l'activité.

    Mon problème est que maintenant que j'ai mis cette contrainte dans mon formulaire , si j'ai un deuxième contact qui a comme activité métier plombier par exemple, le formulaire m'indique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    This value is already used
    du coup l'enregistrement de mon contact et de leurs métiers ne peuvent pas être enregistrer

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
        public function process()
        {
            if($this->request->getMethod()=='POST')
            {
                $this->form->bindRequest($this->request);
     
                if($this->form->isValid())
                {
                    $this->onSuccess($this->form->getData());//enregistrement flush()
                    return true;
                }
            }
            return false;
        }

    si je mets une activité inconnue, ma condition if($this->form->isValide()) est
    acceptée

    si je mets une activité connu le plombier, ma condition if est refusé,
    l'enregistrement ne se fait pas.

    Pourquoi form->isValide n'est pas valide ? que faut t'il faire pour que je fasse en sorte qu'il soit valide ?

    j'espère que j'ai au mieux expliquer mon problème?

    voici mon formbuilder
    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
     
    <?php
     
    namespace Kod\AnnuaireBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
    use Kod\CommercialBundle\Form\MetierType;
     
    class ContactType extends AbstractType
    {
        public function buildForm(FormBuilder $builder,array $options)
        {
            $builder
            ->add('nom')
            ->add('prenom')
            ->add('email')
            ->add('sexe', 'choice', array('choices' => array('F'=>'Féminin','M'=>'Masculin')))
            ->add('phones','collection', array(
    		'type'=> new PhoneType(),
            'prototype'=> true,
            'allow_add'=> true))          
            ->add('adresses','collection', array(
    		'type'=> new AdresseType(),
            'prototype'=> true,
            'allow_add'=> true))
            ->add('metiers','collection', array(
    		'type'=> new MetierType(),
            'prototype'=> true,
            'allow_add'=> true)) 
     
                ;   
        }
     
        public function getName()
        {
            return 'kod_annuaire_contacttype';
        }
     
        public function getDefaultOptions(array $options)
        {
            return array(
                'data_class'=>'Kod\AnnuaireBundle\Entity\Contact',
            );
        }
    }
     
    ?>
    Je vous remercie d'avance pour la réponse et de votre coup de main

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,
    un champ de type collection est utilisé pour éditer supprimer ou créer des entités,
    Il ne va pas aller rechercher de lui-même les entités métiers dont le nom est le même.

    Si tu veux que l'utilisateur choisissent entre différents métier présents dans la base, il faut utiliser un champ entity

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    Merci de ta réponse, j'ai du mal à comprendre.

    Peut tu me donner un exemple?

    utiliser un champs entité mais dans quel classe d'entité ? contact?métier?
    quel champs? un champs collection? (metiers ou activies)

    A quel moment faut t'il faire la recherche pour savoir qu'on a déjà cette actiivté? avant le request->get('POST') après ? avant de crée un FormBuilder?


    faut t'il que je crée une entité contact-métier? dans mon dossier entity/ Contact-Metier.php

    et faut t'il que je retire @unique dans mon entité Métiers?

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    j'ai vu ce tuto

    http://baptiste.xn--clavi-fsa.net/en...un-manytomany/

    c'est dommage je sais pas s'il faut mettre une entité unique? dans mon cas

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    Que veut dire cette phrase ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Il fallait en fait faire une sorte de filtre sur la Collection renvoyée par le formulaire (une collection de Tag), et faire un filtre dessus. En effet, à cahque ajout, l’id était à null… Et comme le champ du tag n’était pas unique (s’il l’était, ça aurait alors posé problème), il se disait que c’en était un nouveau ! D’où la duplication. Une fois le problème identifié, il fallait faire, comme je le disais donc, faire un filtre sur le Repository des tags, pour filtrer la collection et remplacer les éléments si besoin.
    qu'on a enregistrer 2 fois le même champs?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    activité : meunusier
    activité2:meunusier
    ou que lorsqu'on à valider le formulaire,
    symfony regarde dans sa base de donnée si l'activité meunusier est déjà dans la base ??

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    Bon, j'ai trouvé une solution provisoire pour ne pas que le formulaire me dit que l'activité existe déjà, j'ai retirer une cle unique dans le champs activité

    voici mon contact repository

    Code php : 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    <?php
     
    namespace Kod\AnnuaireBundle\Entity;
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\ORM\EntityRepository;
     
     
    /**
     * ContactRepository
     * This class was generated by the Doctrine ORM. Add your own custom
     * repository methods below.
     */
    class ContactRepository extends EntityRepository {
     
        public function rechercheContact($motcle) {
            $qb = $this->_em->createQueryBuilder();
            $qb->select('a')
                    ->from('KodAnnuaireBundle:Contact', 'a')
                    ->where(" a.email  LIKE :motcle ")
                    ->orderBy('a.nom', 'ASC')
                    ->setParameter('motcle', '%' . $motcle . '%');
     
            return $qb->getQuery()
                            ->getResult();
        }
     
        public function filter($metiers) {
     //donner le nom(activité) du métier qui sont ajouter à l'array collection
            // get the tag names that were added in the collection
            $activites = array();
            $flatMenus = array();
     
            foreach ($metiers->toArray() as $k => $activite) {
                if (in_array($activite->getActivite(), $flatMenus)) {
                    $metiers->remove($k);
                    continue;
                }
     
                $flatMenus[] = $activite->getActivite();
     
                if ($activite->getId() === null) {
                    $activites[$k] = $activite->getActivite();
                }
            }
              // si tous les metiers sont déjà présent dans la bdd
            if (!$activites) {
                return;
            }
     
            $qb = $this->createQueryBuilder('m');
            $metiersInDB = $qb->where($qb->expr()->in('m.activite', $activitess))
                    ->getQuery()
                    ->getResult();
     
            // -- Replacing the metiers in the array...
            foreach ($metiersInDB as $activite) {
                $metiers->remove(array_search($activite->getActivite(), $metiers));
                $metiers->add($activite);
            }       
        }
     
    }

    voici mon contact Handler
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    <?php
     
    namespace Kod\AnnuaireBundle\Form;
     
    use Symfony\Component\Form\Form;
    use Symfony\Component\HttpFoundation\Request;
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\ORM\EntityManager;
    use Kod\AnnuaireBundle\Entity\Contact;
    use Kod\AnnuaireBundle\Entity\Phone;
    use Kod\AnnuaireBundle\Entity\Adresse;
    use Kod\CommercialBundle\Entity\Metier;
     
     
    class ContactHandler{
     
        protected $form;
        protected $request;
        protected $em;
        protected $contact;
        protected $repository;
     
     
        private $metier="";
     
     
     
    public function __construct(Form $form,Request $request,EntityManager $em,Contact $contact, $repository)
        {
            $this->form    = $form;
            $this->request = $request;
            $this->em      = $em;
            $this->contact =$contact;
            $this->repository=$repository;
     
        }
     
        public function process()
        {
            if($this->request->getMethod()=='POST')
            {
                $this->form->bindRequest($this->request);
     
                if($this->form->isValid())             
                {
                    echo "is valide";
     
                    //-- filtre menus
     
                   $this->repository->filter($this->contact->getMetiers());
                   //  $this->onSuccess($this->form->getData());
     
     
     
                    return true;
                }
            }
            return false;
        }
     
        public function onSuccess(Contact $contact)
        {
            $this->em->persist($contact);
     
     
            // On persiste tous les tags de l'article.
            foreach($contact->getPhones() as $phone)  
            {
                $this->em->persist($phone);
            }
     
            foreach($contact->getAdresses() as $adresse)  
            {
                $this->em->persist($adresse);
            }
     
            foreach($contact->getMetiers() as $metier)  
            {
     
                //$this->metier = $metier;
                //$this->addMetierContact();
                //var_dump($this->metier);
                $this->em->persist($metier);
     
            }
            $this->em->flush();
        }
     
       public function addMetierContact()
        {
     
            $activite=$this->metier->getActivite();
     
            $repository = $this->em->getRepository('KodCommercialBundle:Metier');
            $issetactivite = $repository->findOneBy(array('activite'=>$activite));
     
     
            if($issetactivite != null)
            {
     
             $this->metier=$issetactivite;
     
            }
     
        }
     
     
     
     
    }
     
    ?>
    j'ai cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [Semantical Error] line 0, col 58 near 'activite IN(': Error: Class Kod\AnnuaireBundle\Entity\Contact has no field or association named activite
    comment fonction exp() ?

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/09/2011, 16h32
  2. probléme d'enregistrement avec les chexkbox.
    Par pmboutteau dans le forum ASP
    Réponses: 16
    Dernier message: 18/10/2005, 15h05
  3. Requête SQL avec une réponse unique
    Par Glutinus dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/07/2005, 16h35
  4. problème de connexion avec une base firebird
    Par vbcasimir dans le forum Bases de données
    Réponses: 1
    Dernier message: 30/05/2005, 11h40
  5. Problèmes d'accent avec une connexion ODBC et ADO
    Par michael.jacques dans le forum Bases de données
    Réponses: 3
    Dernier message: 10/03/2005, 15h36

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