Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony 3] Problème flush()

    19 septembre 2017 à 21:33:18

    Bonsoir, je développe un site avec symfony et j'ai un soucis je souhaite enregistrer un nouvel enfant dans ma BDD avec doctrine, cela fonctionnait très bien et depuis que j'ai installé FosUserBundle quand je fais un $em->flush() j'ai l'mpression qu'il ne fait pas les bonnes requêtes et j'obtiens un message d'erreur :

    An exception occurred while executing 'INSERT INTO user (username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["vincauddu29", "vincauddu29", "vincauddu294@finistere.fr", "vincauddu294@finistere.fr", 1, "iMsiI97mnqFlvOTvF6Yllcq0QGZZfDGzcc7s04o..6A", "eMYQmvoZscpnSwLHgoyvEIZRfTN5VZUrO89aNx8\/4X4suty9f0BKNtjGTDdbzsQpNPHSHz1YZ05wVisPnD85eA==", null, null, null, "N;"]:

    SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicata du champ 'vincauddu29' pour la clef 'UNIQ_8D93D64992FC23A8'

    Voici mon controlleur qui gere les objets enfant :

    <?php
    
    namespace SiteBundle\Controller;
    
    use SiteBundle\Form\EnfantType;
    use SiteBundle\Repository\EnfantRepository;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpFoundation\JsonResponse;
    use SiteBundle\Entity\Enfant;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    
    class EnfantController extends Controller
    {
        public function ajouterAction(Request $request)
        {
            // On creer une nouvelle ligne
            $enfant = new Enfant();
            $profil = $_SESSION['profil'];
    
            // On créer le formBuilder
            $form = $this->get('form.factory')->create(EnfantType::class,$enfant);
    
            if($request->isMethod('POST') && $form->handleRequest($request)->isValid()){
                $em = $this->getDoctrine()->getManager();
                $enfant->setProfil($profil);
                $em->persist($enfant);
                $em->flush();
                //return new RedirectResponse($this->get('router')->generate('ajouterAdresse'));
            }
            return $this->render('SiteBundle:Default:ajouterEnfant.html.twig', array('form' => $form->createView()));
        }
    
        public function listerAction(Request $request){
            $em = $this->getDoctrine()->getManager();
            $profil = $_SESSION['profil'];
            $repositoryEnfant = $em->getRepository('SiteBundle:Enfant');
            $enfants = $repositoryEnfant->findBy(array('profil' => $profil));
    
            return $this->render('SiteBundle:Default:listerEnfants.html.twig', array('enfants' => $enfants));
    
        }
    
        public function afficherAction(Request $request){
            if($request->isXmlHttpRequest()) {
                $em = $this->getDoctrine()->getManager();
                $repositoryEnfant = $em->getRepository('SiteBundle:Enfant');
                $enfant = $repositoryEnfant->find($request->get('idEnfant'));
                $adresses = $em->getRepository('SiteBundle:Adresse')->findBy(array('enfant' => $enfant));
                $list = array();
                $listAdresses = array();
                $list['id'] = $enfant->getId();
                $list['nom'] = $enfant->getNom();
                $list['prenom'] = $enfant->getPrenom();
                $list['dateNaissance'] = $enfant->getDateNaissance();
                foreach ($adresses as $adresse){
                    $listAdresses[$adresse->getId()] = $adresse->getNom();
                }
                $list['adresses'] = $listAdresses;
                return new JsonResponse(array('data' => json_encode($list)));
            }
            return new Response("Erreur : Ce n'est pas une requête Ajax", 400);
        }
    
        public function supprimerAction(Request $request){
            if($request->isXmlHttpRequest()) {
                $em = $this->getDoctrine()->getManager();
                $repositoryEnfant = $em->getRepository('SiteBundle:Enfant');
                $enfant = $repositoryEnfant->find($request->get('idEnfant'));
                $adresses = $em->getRepository('SiteBundle:Adresse')->findBy(array('enfant' => $enfant));
                $lignes = $em->getRepository('SiteBundle:Ligne')->findBy(array('enfant' => $enfant));
                foreach ($adresses as $adresse){
                    $em->remove($adresse);
                }
                foreach ($lignes as $ligne){
                    $em->remove($ligne);
                }
                $em->remove($enfant);
                $em->flush();
                return new JsonResponse(array('data' => json_encode('OK')));
            }
            return new Response("Erreur : Ce n'est pas une requête Ajax", 400);
        }
    
        public function modifierAction(Request $request){
            $em = $this->getDoctrine()->getManager();
            $repositoryEnfant = $em->getRepository('SiteBundle:Enfant');
            $enfant = $repositoryEnfant->find($request->get('idEnfant'));
            $enfant->setNom($request->get('nom'));
            $enfant->setPrenom($request->get('prenom'));
            $enfant->setDateNaissance($request->get('dateNaissance'));
            $em->flush();
            return new RedirectResponse($this->get('router')->generate('listerEnfants'));
        }
    }


    Et voici mon Objet enfant.php

    <?php
    
    namespace SiteBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Validator\Constraints as Assert;
    
    /**
     * Enfant
     *
     * @ORM\Table(name="enfant")
     * @ORM\Entity(repositoryClass="SiteBundle\Repository\EnfantRepository")
     */
    class Enfant
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
    
        /**
         * @var string
         *
         * @ORM\Column(name="nom", type="string", length=50)
         * @Assert\NotBlank()
         * @Assert\Length(max=50)
         */
        private $nom;
    
        /**
         * @var string
         *
         * @ORM\Column(name="prenom", type="string", length=50)
         * @Assert\NotBlank()
         * @Assert\Length(max=50)
         */
        private $prenom;
    
        /**
         * @ORM\ManyToOne(targetEntity="SiteBundle\Entity\Profil", cascade={"persist"})
         * @ORM\JoinColumn(nullable=false)
         */
        private $profil;
    
        /**
         * @var string
         *
         * @ORM\Column(name="dateNaissance", type="string", length=10)
         * @Assert\NotBlank()
         * @Assert\Length(max=10)
         */
        private $dateNaissance;
    
    
        /**
         * Get id
         *
         * @return int
         */
        public function getId()
        {
            return $this->id;
        }
    
        /**
         * Set nom
         *
         * @param string $nom
         *
         * @return Enfant
         */
        public function setNom($nom)
        {
            $this->nom = $nom;
    
            return $this;
        }
    
        /**
         * Get nom
         *
         * @return string
         */
        public function getNom()
        {
            return $this->nom;
        }
    
        /**
         * Set prenom
         *
         * @param string $prenom
         *
         * @return Enfant
         */
        public function setPrenom($prenom)
        {
            $this->prenom = $prenom;
    
            return $this;
        }
    
        /**
         * Get prenom
         *
         * @return string
         */
        public function getPrenom()
        {
            return $this->prenom;
        }
    
        /**
         * Set idProfil
         *
         * @param integer $idProfil
         *
         * @return Enfant
         */
        public function setIdProfil($idProfil)
        {
            $this->idProfil = $idProfil;
    
            return $this;
        }
    
        /**
         * Get idProfil
         *
         * @return int
         */
        public function getIdProfil()
        {
            return $this->idProfil;
        }
    
        /**
         * Set dateNaissance
         *
         * @param string $dateNaissance
         *
         * @return Enfant
         */
        public function setDateNaissance($dateNaissance)
        {
            $this->dateNaissance = $dateNaissance;
    
            return $this;
        }
    
        /**
         * Get dateNaissance
         *
         * @return string
         */
        public function getDateNaissance()
        {
            return $this->dateNaissance;
        }
    
        /**
         * Set profil
         *
         * @param \SiteBundle\Entity\Profil $profil
         *
         * @return Enfant
         */
        public function setProfil(\SiteBundle\Entity\Profil $profil)
        {
            $this->profil = $profil;
    
            return $this;
        }
    
        /**
         * Get profil
         *
         * @return \SiteBundle\Entity\Profil
         */
        public function getProfil()
        {
            return $this->profil;
        }
    }
    

    Et mon user.php

    <?php
    
    namespace UserBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use FOS\UserBundle\Model\User as BaseUser;
    use Symfony\Component\Validator\Constraints as Assert;
    
    /**
     * User
     *
     * @ORM\Table(name="user")
     * @ORM\Entity(repositoryClass="UserBundle\Repository\UserRepository")
     */
    class User extends BaseUser
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
    
        /**
         * @var string
         * @Assert\Regex(
         *     pattern = "#[a-z0-9]{1,}@finistere.fr$#i",
         *     htmlPattern = "[a-zA-Z0-9]{1,}@finistere.fr$",
         *     message="Veuillez utiliser votre adresse @finistere.fr")
         */
        protected $email;
    
        /**
         * @var string
         * @Assert\Regex(
         *     pattern = "#[a-z0-9]{1,}@finistere.fr$#i",
         *     htmlPattern = "[a-zA-Z0-9]{1,}@finistere.fr$",
         *     message="Veuillez utiliser votre adresse @finistere.fr")
         */
        protected $emailCanonical;
    
        /**
         * Plain password. Used for model validation. Must not be persisted.
         *
         * @var string
         * @Assert\Regex(
         *     pattern = "#^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\W).{6,}$#",
         *     htmlPattern = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\W).{6,}$",
         *     message = "Le mot de passe doit contenir au moins une miniscule, une majeuscule, un nombre et un symbole")
         */
        protected $plainPassword;
    }
    

    Merci d'avance pour vos réponses.

    Cordialement Vincauddu29


    • Partager sur Facebook
    • Partager sur Twitter
      19 septembre 2017 à 21:53:13

      Integrity constraint violation: 1062 Duplicata du champ 'vincauddu29' pour la clef 'UNIQ_8D93D64992FC23A8'

      Édit: Il y a une clé unique sur "username" donc tu ne peux pas persister "vincauddu29" deux fois ce qui est logique vu que par défaut l'utilisateur peut utiliser son username comme identifiant pour se connecter :)



      -
      Edité par Strategy 19 septembre 2017 à 22:01:54

      • Partager sur Facebook
      • Partager sur Twitter
        19 septembre 2017 à 23:24:19

        merci de ta réponse mais je ne veux pas persister un nouveau user mais un nouvel enfant c'est ca que je ne comprends pas pourquoi il fait un insert dans la table user.
        • Partager sur Facebook
        • Partager sur Twitter
          21 septembre 2017 à 15:28:08

          Salut,

          Peux-tu poster ta class"Profil" ?

          Et pourquoi dans ta class "Enfant" tu as un setter et getter pour un attribut "idProfil" ?

          • Partager sur Facebook
          • Partager sur Twitter
            22 septembre 2017 à 17:11:25

            Merci pour ta réponse. Bonne question ... C'est un restant de code qui ne servait plus a rien :D c'est bon je les ai supprimé.

            Alors mon entité Profil :

            <?php

            namespace SiteBundle\Entity;

            use Doctrine\ORM\Mapping as ORM;
            use Symfony\Component\Validator\Constraints as Assert;
            use UserBundle\Entity\User;

            /**
            * Profil
            *
            * @ORM\Table(name="profil")
            * @ORM\Entity(repositoryClass="SiteBundle\Repository\ProfilRepository")
            */
            class Profil
            {
            /**
            * @var int
            *
            * @ORM\Column(name="id", type="integer")
            * @ORM\Id
            * @ORM\GeneratedValue(strategy="AUTO")
            */
            private $id;

            /**
            * @var string
            *
            * @ORM\Column(name="nomProfil", type="string", length=50)
            * @Assert\NotBlank()
            * @Assert\Length(max=50)
            */
            private $nomProfil;

            /**
            * @var string
            *
            * @ORM\Column(name="nom", type="string", length=50)
            * @Assert\NotBlank()
            * @Assert\Length(max=50)
            */
            private $nom;

            /**
            * @var string
            *
            * @ORM\Column(name="prenom", type="string", length=50)
            * @Assert\NotBlank()
            * @Assert\Length(max=50)
            */
            private $prenom;

            /**
            * @var string
            *
            * @ORM\Column(name="adressePostal", type="string", length=50)
            * @Assert\NotBlank()
            * @Assert\Length(max=50)
            */
            private $adressePostal;

            /**
            * @var integer
            *
            * @ORM\Column(name="codePostale", type="integer", length=5)
            * @Assert\NotBlank()
            * @Assert\Length(max=5)
            */
            private $codePostal;

            /**
            * @var string
            *
            * @ORM\Column(name="ville", type="string", length=50)
            * @Assert\NotBlank()
            * @Assert\Length(max=50)
            */
            private $ville;

            /**
            * @var string
            *
            * @ORM\Column(name="email", type="string", length=255)
            * @Assert\NotBlank()
            * @Assert\Length(max=255)
            * @Assert\Email()
            */
            private $email;

            /**
            * @var string
            *
            * @ORM\Column(name="fixe", type="string", length=14)
            * @Assert\NotBlank()
            * @Assert\Length(max=14)
            */
            private $fixe;

            /**
            * @var string
            *
            * @ORM\Column(name="portable", type="string", length=14)
            * @Assert\NotBlank()
            * @Assert\Length(max=14)
            */
            private $portable;

            /**
            * @ORM\ManyToOne(targetEntity="UserBundle\Entity\User", cascade={"persist"})
            * @ORM\JoinColumn(nullable=false)
            *
            */
            private $user;


            /**
            * Get id
            *
            * @return int
            */
            public function getId()
            {
            return $this->id;
            }

            /**
            * Set nom
            *
            * @param string $nom
            *
            * @return Profil
            */
            public function setNom($nom)
            {
            $this->nom = $nom;

            return $this;
            }

            /**
            * Get nom
            *
            * @return string
            */
            public function getNom()
            {
            return $this->nom;
            }

            /**
            * Set prenom
            *
            * @param string $prenom
            *
            * @return Profil
            */
            public function setPrenom($prenom)
            {
            $this->prenom = $prenom;

            return $this;
            }

            /**
            * Get prenom
            *
            * @return string
            */
            public function getPrenom()
            {
            return $this->prenom;
            }

            /**
            * Set adressePostal
            *
            * @param string $adressePostal
            *
            * @return Profil
            */
            public function setAdressePostal($adressePostal)
            {
            $this->adressePostal = $adressePostal;

            return $this;
            }

            /**
            * Get adressePostal
            *
            * @return string
            */
            public function getAdressePostal()
            {
            return $this->adressePostal;
            }

            /**
            * Set adressePostal
            *
            * @param integer $codePostale
            *
            * @return Profil
            */
            public function setCodePostal($codePostal)
            {
            $this->codePostal = $codePostal;

            return $this;
            }

            /**
            * Get codePostale
            *
            * @return integer
            */
            public function getCodePostal()
            {
            return $this->codePostal;
            }

            /**
            * Set ville
            *
            * @param string $ville
            *
            * @return Profil
            */
            public function setVille($ville)
            {
            $this->ville = $ville;

            return $this;
            }

            /**
            * Get ville
            *
            * @return string
            */
            public function getVille()
            {
            return $this->ville;
            }

            /**
            * Set email
            *
            * @param string $email
            *
            * @return Profil
            */
            public function setEmail($email)
            {
            $this->email = $email;

            return $this;
            }

            /**
            * Get email
            *
            * @return string
            */
            public function getEmail()
            {
            return $this->email;
            }

            /**
            * Set fixe
            *
            * @param string $fixe
            *
            * @return Profil
            */
            public function setFixe($fixe)
            {
            $this->fixe = $fixe;

            return $this;
            }

            /**
            * Get fixe
            *
            * @return string
            */
            public function getFixe()
            {
            return $this->fixe;
            }

            /**
            * Set portable
            *
            * @param string $portable
            *
            * @return Profil
            */
            public function setPortable($portable)
            {
            $this->portable = $portable;

            return $this;
            }

            /**
            * Get portable
            *
            * @return string
            */
            public function getPortable()
            {
            return $this->portable;
            }

            /**
            * Set user
            *
            * @param \UserBundle\Entity\User $user
            *
            * @return Profil
            */
            public function setUser(\UserBundle\Entity\User $user)
            {
            $this->user = $user;

            return $this;
            }

            /**
            * Get user
            *
            * @return \UserBundle\Entity\User
            */
            public function getUser()
            {
            return $this->user;
            }

            /**
            * Set nomProfil
            *
            * @param string $nomProfil
            *
            * @return Profil
            */
            public function setNomProfil($nomProfil)
            {
            $this->nomProfil = $nomProfil;

            return $this;
            }

            /**
            * Get nomProfil
            *
            * @return string
            */
            public function getNomProfil()
            {
            return $this->nomProfil;
            }
            }
            • Partager sur Facebook
            • Partager sur Twitter

            [Symfony 3] Problème flush()

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown