sauvegarder dans BDD chaque fois que passage dans boucle for
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:
Code:
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
| 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:
Citation:
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 !