Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony 1062 Duplicate entry '' for key 'PRIMARY'

Symfony 1062 Duplicate entry '' for key 'PRIMARY'

Sujet résolu
    27 mars 2024 à 18:37:22

    Bonjour à tous,

    Je rencontre actuellement un problème lors de l'insertion de données dans une base de données à l'aide de Symfony. Lorsque j'essaie d'insérer des données dans la table date_diffusion, une erreur de violation de contrainte d'intégrité se produit, plus précisément une erreur SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'PRIMARY'.

    Après avoir examiné mon code, je n'arrive pas à identifier la source exacte du problème.

    Mon entity DateDiffusion.php

    <?php
    
    namespace App\Entity;
    
    use App\Repository\DateDiffusionRepository;
    use Doctrine\ORM\Mapping as ORM;
    
    #[ORM\Entity(repositoryClass: DateDiffusionRepository::class)]
    class DateDiffusion
    {
        #[ORM\Id]
        #[ORM\GeneratedValue]
        #[ORM\Column]
        private $id;
    
        #[ORM\Column(type: "datetime")]
        private $date;
    
        #[ORM\Column(type: "time")]
        private $heureDebut;
    
        /********DEBUT MOVIE********************/
        #[ORM\ManyToOne(targetEntity: Movie::class, inversedBy: "dateDiffusions")] // Relation avec la "private $dateDiffusions;" de l'entity Movie
        #[ORM\JoinColumn(nullable: false)]
        private $movie;
    
        public function getMovie(): ?Movie
        {
            return $this->movie;
        }
    
        public function setMovie(?Movie $movie): self
        {
            $this->movie = $movie;
    
            return $this;
        }
        /********FIN MOVIE********************/
        public function getId(): ?int
        {
            return $this->id;
        }
    
        public function getDate(): ?\DateTimeInterface
        {
            return $this->date;
        }
    
        public function setDate(\DateTimeInterface $date): self
        {
            $this->date = $date;
    
            return $this;
        }
    
        public function getHeureDebut(): ?\DateTimeInterface
        {
            return $this->heureDebut;
        }
    
        public function setHeureDebut(\DateTimeInterface $heureDebut): self
        {
            $this->heureDebut = $heureDebut;
    
            return $this;
        }
    }
    

    Mon contrôleur ou je submit :

    #[Route('/addmovie', name: 'app_movie')]
        public function addmovie(Request $request, EntityManagerInterface $em): Response
        {
            $movie = new Movie();
    
            // Instancier DateDiffusion et l'ajouter au film
            $dateDiffusion = new DateDiffusion();
            $movie->addDateDiffusion($dateDiffusion);
    
            // Récupérer les salles disponibles pour l'utilisateur courant
            $user = $this->getUser();
            $salles = $user->getSalles();  
    
            $form = $this->createForm(MovieType::class, $movie, ['salles' => $salles]);
            $form->handleRequest($request);
            
            if ($form->isSubmitted() && $form->isValid()) {
                // boucle pour associer la date et l'horaire au film
                foreach ($movie->getDateDiffusions() as $dateDiffusion) {
                    $dateDiffusion->setMovie($movie);
                    $em->persist($dateDiffusion);
                }
                
                // Persister le film et les dates de diffusion 
                $em->persist($movie);
                $em->flush();
                
                $this->addFlash('success', 'Le film a bien été ajouté avec ses dates de diffusion.');
                return $this->redirectToRoute('home/index.html.twig');
            }
            
            return $this->render('movie/new.html.twig', [
                'form' => $form->createView()
            ]);
        }





    • Partager sur Facebook
    • Partager sur Twitter
      28 mars 2024 à 11:31:10

      Salut

      Tu nous confirmes que c'est bien pour un objet DateDiffusion que le problème survient, et non pour un objet Salle ?
      Est-ce que ta base de données est correctement synchronisée avec tes modèles, notamment au niveau des auto-incréments des différentes tables ?

      Cette boucle pour enregistrer m'interpelle. Si tes mappings (Movie#dateDiffusions) et formulaires sont bien faits (un champ dans MovieType, de type Collection, pour ajouter les dates), tu ne devrais avoir à persister que (oui, uniquement) le film sans persister explicitement et séparément les dates.

      • Partager sur Facebook
      • Partager sur Twitter
        28 mars 2024 à 18:43:34

        Bonjour et merci de ta réponse , oui c'est bien de Datediffusion 

        Oui je pense que c'est bin synchro , mais bon je me doute que il doit y avoir une erreur que je ne voie pas .... 

        Voici le github de mon projet : https://github.com/xavgdt66/Cin-ma 

        • Partager sur Facebook
        • Partager sur Twitter
          28 mars 2024 à 19:06:27

          Plutôt que penser, lance doctrine:schema:update --dump-sql pour en être sûr.

          Je persiste à penser que tu peux te passer de la boucle des lignes 18 à 22 du code fourni pour le contrôleur si tes mappings ont les informations de cascade. Et peut-être que cela pourrait éviter le problème, justement.

          • Partager sur Facebook
          • Partager sur Twitter
            28 mars 2024 à 21:06:14

            J'ai lancer doctrine:schema:update --dump-sql  et cela ne se règle pas . 


            Ensuite j'ai fait cela avec en enlevant la boucle mais cela ne fonctionne pas , j'ai toujours le mem soucis quand je submit 


            #[Route('/addmovie', name: 'app_movie')]
                public function addmovie(Request $request, EntityManagerInterface $em): Response
                {
                    $movie = new Movie();
            
                    // Instancier DateDiffusion et l'ajouter au film
                    $dateDiffusion = new DateDiffusion();
                    $movie->addDateDiffusion($dateDiffusion);
            
                    // Récupérer les salles disponibles pour l'utilisateur courant
                    $user = $this->getUser();
                    $salles = $user->getSalles();
            
                    $form = $this->createForm(MovieType::class, $movie, ['salles' => $salles]);
                    $form->handleRequest($request);
                    
                    if ($form->isSubmitted() && $form->isValid()) {
                        // Utiliser la méthode "map" de Doctrine pour associer chaque date de diffusion au film
                        $movie->getDateDiffusions()->map(function($dateDiffusion) use ($movie) {
                            $dateDiffusion->setMovie($movie);
                        });
            
                        // Persister le film et les dates de diffusion 
                        $em->persist($movie);
                        $em->flush();
            
                        $this->addFlash('success', 'Le film a bien été ajouté avec ses dates de diffusion.');
                        return $this->redirectToRoute('home/index.html.twig');
                    }
                    return $this->render('movie/new.html.twig', [
                        'form' => $form->createView()
                    ]);
                }

            mon entity movie : 

             #[ORM\OneToMany(targetEntity: DateDiffusion::class, mappedBy: "movie", cascade:['persist'])] // Relation avec la "private $movie;" de l'entity DateDiffusion
            
                private $dateDiffusions;




            • Partager sur Facebook
            • Partager sur Twitter
              28 mars 2024 à 21:26:31

              Spawnkiller68 a écrit:

              J'ai lancer doctrine:schema:update --dump-sql et cela ne se règle pas .

              Ce n'est pas le but de cette commande, cela devrait fournir des informations sur d'éventuelles différences entre tes entités et la base de données. La sortie de cette commande te disait-elle que tout était OK ?

              Tu ne devrais pas avoir à faire de map non-plus, regarde la FAQ à ce propos.

              Edit

              Les propriétés de tes entités ont parfois des types natifs (par exemple Movie), parfois pas (p. ex. salle et DateDiffusion, étrangement). Mais surtout, pour DateDiffusion, tu n'as aucunement spécifié le type de la colonne ID. Ce qui fait que par défaut c'est type texte, sans génération automatique.

              -
              Edité par Ymox 28 mars 2024 à 21:52:56

              • Partager sur Facebook
              • Partager sur Twitter
                29 mars 2024 à 17:13:41

                Salut,

                Merci, tu es génial ! Le souci venait de DateDiffusion et de la colonne ID. Merci, je m'en rappellerai maintenant si je retombe sur cette erreur.

                Merci à toi pour tout ce que tu fais pour la communauté.

                • Partager sur Facebook
                • Partager sur Twitter

                Symfony 1062 Duplicate entry '' for key 'PRIMARY'

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                • Editeur
                • Markdown