Bonjour,

Voila je rencontre un petit problème avec mon code. Je travaille avec Symfony et fais mes enregistrements avec Doctrine.
Dans mon programme, je propose à un utilisateur de remplire une fiche. Cette fiche s'enregistrera dans la table prévue à cet effet. La table de la fiche et la table de l'utilisateur sont liées grâce à une clef étrangère (user_id) présente dans la table de la fiche. Cependant, j'aimerai aussi que l'uilisateur qui crée la fiche puisse renseigner d'autres utilisateurs sur la fiche et que ceux-ci soient également "reliés" à la fiche. Pour cela j'ai fait une nouvelle base (identifiant) avec deux clefs étragère: fiche_id et user_id. L'utilisateur a la possibilité de cocher plusieurs utilisateurs à renseigner.Pour cela j'ai fais la boucle foreach qui récupère toutes les valeurs de mes checkBox

Voici la fonction:

 public function creationFicheNC (Request $request, ObjectManager $manager){

        $ficheNC= new FicheNC();
        $utilisateur=$this->getUser();
       // $form=$this->get('form.factory')->create(ficheNCType::class, $ficheNC);

        $listeUsers = $this
            ->getDoctrine()
            ->getRepository(User::class)
            ->findBy([ 'rolesString'=>['User2','Admin']]);

        if ($request->isMethod('POST')) {

            $titre=$request->request->get('titre');
            $categorie=$request->request->get('categorie');
            $ficheNC->setTitre($titre);
            if($categorie=='PourInfo'){
                $ficheNC->setCategorie('Pour Information');
            }elseif ($categorie=='Mineure'){
                $ficheNC->setCategorie('Mineure');
            }elseif ($categorie=='Majeure'){
                $ficheNC->setCategorie('Majeure');
            }

           $ficheNC->setUser($utilisateur);
           // $form->handleRequest($request);
           $manager = $this->getDoctrine()->getManager();
            $ficheNC->setDate(date('d-m-Y'));
            //if($form->isSubmitted() && $form->isValid()){

            $manager->persist($ficheNC);

            foreach( $request->request->get('listUser') as $chkbx){

                $identifiant=new Identifiants();
                $utilisateur=$this->getDoctrine()->getRepository(User::class)->find($chkbx);

                $identifiant->setUserFiche($utilisateur);
                $identifiant->setFicheNCUser($ficheNC);

                $manager->persist($identifiant);
                $manager->flush();

            }

            $manager->flush();
                return new Response('Saved new ficheNC with id '.$ficheNC->getId());
          // }
            //return new Response('le titre est: '.$ficheNC->getTitre().'    la categorie est:'.$ficheNC->getCategorie());
        }

        return $this->render('listUser2FicheNC.html.twig', array(
            'currentController' => 'User',
            'currentPage' => 'account',
            'listeUsers' => $listeUsers,
            //'form' => $form->createView(),
        ));

    }

Pout chaque utilisateurs qui ont été séléctionnés, la fiche qui est crée et l'utilisateur selectionné sont attribué à la base identifiant.

J'aimerai qu'à chaque utilisateur cochés une nouvelle ligne (un nouvel "identifiant" dans la bas identifiant) soit crée.

Je reçois l'erreur suivante:
An exception occurred while executing 'INSERT INTO identifiants (user_id, fiche_nc_id) VALUES (?, ?)' with params [5, 10]:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '5' for key 'UNIQ_B27B6551A76ED395'

Ici l'identifiant de ma fiche est 10 et les identifiants de mes utilisateurs sont 5 et 1
Lorsque je veux ajouter les identifants 1 et 2 cela ne prend en compte que l'identifiant 2.

Il remarque qu'il y a une "Duplicate entry", comment faire pour qu'il ne me mette pas d'erreur et qu'il enregistre le nouvel "identifiant" de la base à chaque tour du for ?

Merci pour vos réponses !

1 réponse


Romane Pm
Auteur
Réponse acceptée

Finalement c'est bon !! j'avais juste pas mis la bonne relation pour la base de données, j'avais mis OneToOne alors qu'il fallait mettre ManyToOne