Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony] Query Builder dans form selection

    22 septembre 2017 à 11:32:22

    Bonjour,

    J'ai un soucis sur Symfony 3 et après avoir chercher des tonnes de solutions je ne comprends pas l'utilisation du query builder.

    Je vous explique mon problème.

    J'ai une entité meeting qui est basique, dans cette entité j'ai un champ club qui fait appel à une autre entité.

    J'aimerais simplement afficher dans mon formulaire de création de meeting afficher le nom de tout les clubs qui existent et quand on submit le form j'aimerais avoir l'id du club histoire de pouvoir récuperer les infos du club.

    Problème, je n'arrive absolument pas à récuperer tout mes id de club ...

    J'ai fais ceci mais j'ai une erreur : 

    Warning: spl_object_hash() expects parameter 1 to be object, integer given

    ->add('nomClub',EntityType::class,array(
                    'em' => 'mssql1',
                    'class' => 'AppBundle\Entity\TblClub',
                    'query_builder' => function(EntityRepository $er){
                        return $er->createQueryBuilder('u')
                            ->select('u.id');
                    },
                    'choice_label' => 'nom',
                ))

    J'ai compris de part l'erreur que je ne pouvais pas faire un select u.id mais dans ce cas il m'affiche les nom des clubs grace a tooString dans mon entité mais il ajoute les noms dans la BDD et pas les ids du coup je ne peux pas récuperer les infos du club en twig en utilisant par exemple 

    {{ meeting.club.nom }}

    Avez vous des solutions ? 

    • Partager sur Facebook
    • Partager sur Twitter
      22 septembre 2017 à 12:02:50

      Je pense que tu peux faire ça :

      ->add('club',EntityType::class,array(
          'em' => 'mssql1',
          'class' => 'AppBundle\Entity\TblClub',
          'query_builder' => function(ClubRepository $repository){
              return $repository->findAll();
      }, 'choice_label' => 'nom', ))



      -
      Edité par Whouki 22 septembre 2017 à 12:06:02

      • Partager sur Facebook
      • Partager sur Twitter
        22 septembre 2017 à 12:14:06

        Je pense que j'avais deja essayé cette solution malgrès tout j'ai ré-essayer et j'ai cette erreur maintenant 

        Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given

        • Partager sur Facebook
        • Partager sur Twitter
          22 septembre 2017 à 14:07:48

          Ah oui, bien sur, autant pour moi!

          ->add('club',EntityType::class,array(
              'em' => 'mssql1',
              'class' => 'AppBundle\Entity\TblClub',
              'query_builder' => function(ClubRepository $repository){
                  return $repository->createQueryBuilder('club_repository');
              },
              'choice_label' => 'nom',
          ))



          • Partager sur Facebook
          • Partager sur Twitter
            22 septembre 2017 à 14:13:11

            Cela fonctionne mais j'ai toujours le même problème, comment puis-je insérer dans ma BDD l'id du club et non pas son nom ?
            • Partager sur Facebook
            • Partager sur Twitter
              22 septembre 2017 à 14:23:01

              Càd? Je ne comprend pas trop ton problème?

              ->add('club',EntityType::class,array(
                  'em' => 'mssql1',
                  'class' => 'AppBundle\Entity\TblClub',
                  'query_builder' => function(ClubRepository $repository){
                      return $repository->createQueryBuilder('club_repository');
                  },
                  'choice_label' => 'nom',
                  'choice_value' => 'id'
              ))

              Est-ce que ceci répond à ta problématique?

              • Partager sur Facebook
              • Partager sur Twitter
                22 septembre 2017 à 14:29:38

                En théorie ce que tu as écrit est la solution c'est-a-dire, j'ai un select avec le nom des clubs et quand je submit mon form, l'id du club devrait se retrouver dans la BDD

                Sauf que c'est pas le cas, j'ai le nom du club qui est insérer dans ma base au lieu de son id.

                C'est juste ça le problème...

                • Partager sur Facebook
                • Partager sur Twitter
                  22 septembre 2017 à 14:51:09

                  Montre un peu comment tu as fait ta relation dans ton modèle ? (entre club et l'entité dans laquelle il est contenu)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 septembre 2017 à 14:55:05

                    Club : 

                    <?php
                    /**
                     * Created by PhpStorm.
                     * User: maxime
                     * Date: 19/09/2017
                     * Time: 14:18
                     */
                    
                    namespace AppBundle\Entity;
                    
                    use Doctrine\ORM\Mapping as ORM;
                    
                    /**
                     * TblClub
                     *
                     * @ORM\Table(name="tbl_club")
                     * @ORM\Entity(repositoryClass="AppBundle\Repository\TblClubRepository")
                     */
                    
                    class TblClub
                    {
                        /**
                         * @ORM\Column(name="id", type="integer")
                         * @ORM\Id
                         * @ORM\GeneratedValue(strategy="AUTO")
                         */
                        private $id;
                    
                        /**
                         * @var string
                         *
                         * @ORM\Column(name="nom", type="string", length=50, nullable=false)
                         */
                        private $nom;
                    
                        /**
                         * @var string
                         *
                         * @ORM\Column(name="ambiance", type="string", length=50, nullable=true)
                         */
                        private $ambiance;
                    
                        /**
                         * @var string
                         *
                         * @ORM\Column(name="url", type="string", length=255, nullable=true)
                         */
                        private $url;
                    
                        /**
                         * @var string
                         *
                         * @ORM\Column(name="code", type="string", length=50, nullable=true)
                         */
                        private $code;
                    
                        /**
                         * @return int
                         */
                        public function getId()
                        {
                            return $this->id;
                        }
                    
                        /**
                         * @param integer $id
                         */
                        public function setId(int $id)
                        {
                            $this->id = $id;
                        }
                    
                        /**
                         * @return string
                         */
                        public function getNom()
                        {
                            return $this->nom;
                        }
                    
                        /**
                         * @param string $nom
                         */
                        public function setNom(string $nom)
                        {
                            $this->nom = $nom;
                        }
                    
                        /**
                         * @return string
                         */
                        public function getAmbiance()
                        {
                            return $this->ambiance;
                        }
                    
                        /**
                         * @param string $ambiance
                         */
                        public function setAmbiance(string $ambiance)
                        {
                            $this->ambiance = $ambiance;
                        }
                    
                        /**
                         * @return string
                         */
                        public function getUrl()
                        {
                            return $this->url;
                        }
                    
                        /**
                         * @param string $url
                         */
                        public function setUrl(string $url)
                        {
                            $this->url = $url;
                        }
                    
                        /**
                         * @return string
                         */
                        public function getCode()
                        {
                            return $this->code;
                        }
                    
                        /**
                         * @param string $code
                         */
                        public function setCode(string $code)
                        {
                            $this->code = $code;
                        }
                    
                        public function __toString() {
                            return $this->nom;
                        }
                    
                    
                    }

                    Meeting : 

                    <?php
                    /**
                     * Created by PhpStorm.
                     * User: maxime
                     * Date: 14/09/2017
                     * Time: 15:47
                     */
                    
                    namespace AppBundle\Entity;
                    
                    use Doctrine\ORM\Mapping as ORM;
                    
                    /**
                     * TblMeetingInterne
                     *
                     * @ORM\Table(name="tbl_meeting_interne")
                     * @ORM\Entity(repositoryClass="AppBundle\Repository\TblMeetingInterneRepository")
                     */
                    class TblMeetingInterne
                    {
                        /**
                         * @var integer
                         *
                         * @ORM\Column(name="id", type="integer")
                         * @ORM\Id
                         * @ORM\GeneratedValue(strategy="AUTO")
                         */
                        private $id;
                    
                        /**
                         * @var string
                         *
                         * @ORM\Column(name="nom", type="string", length=50, nullable=false)
                         */
                        private $nom;
                    
                        /**
                         * @var string
                         *
                         * @ORM\Column(name="description", type="string", nullable=true)
                         */
                        private $description;
                    
                        /**
                         * @var \DateTime
                         *
                         * @ORM\Column(name="date_debut", type="datetime", nullable=false)
                         */
                        private $dateDebut;
                    
                        /**
                         * @var \DateTime
                         *
                         * @ORM\Column(name="date_fin", type="datetime", nullable=false)
                         */
                        private $dateFin;
                    
                        /**
                         * @var string
                         *
                         * @ORM\Column(name="nomClub", type="string", length=50, nullable=false)
                         */
                        private $nomClub;
                    
                        /**
                         * @var string
                         *
                         * @ORM\Column(name="adresse", type="string", length=50, nullable=false)
                         */
                        private $adresse;
                    
                        /**
                         * @var string
                         *
                         * @ORM\Column(name="color", type="string", length=10, nullable=false)
                         */
                        private $color;
                    
                        /**
                         * @return int
                         */
                        public function getId()
                        {
                            return $this->id;
                        }
                    
                        /**
                         * @param int $id
                         */
                        public function setId(int $id)
                        {
                            $this->id = $id;
                        }
                    
                        /**
                         * @return string
                         */
                        public function getNom()
                        {
                            return $this->nom;
                        }
                    
                        /**
                         * @param string $nom
                         */
                        public function setNom(string $nom)
                        {
                            $this->nom = $nom;
                        }
                    
                        /**
                         * @return string
                         */
                        public function getDescription()
                        {
                            return $this->description;
                        }
                    
                        /**
                         * @param string $description
                         */
                        public function setDescription(string $description)
                        {
                            $this->description = $description;
                        }
                    
                        /**
                         * @return \DateTime
                         */
                        public function getDateDebut()
                        {
                            return $this->dateDebut;
                        }
                    
                        /**
                         * @param \DateTime $dateDebut
                         */
                        public function setDateDebut(\DateTime $dateDebut)
                        {
                            $this->dateDebut = $dateDebut;
                        }
                    
                        /**
                         * @return \DateTime
                         */
                        public function getDateFin()
                        {
                            return $this->dateFin;
                        }
                    
                        /**
                         * @param \DateTime $dateFin
                         */
                        public function setDateFin(\DateTime $dateFin)
                        {
                            $this->dateFin = $dateFin;
                        }
                    
                        /**
                         * @return string
                         */
                        public function getNomClub()
                        {
                            return $this->nomClub;
                        }
                    
                        /**
                         * @param string $nomClub
                         */
                        public function setNomClub(string $nomClub)
                        {
                            $this->nomClub = $nomClub;
                        }
                    
                        /**
                         * @return string
                         */
                        public function getAdresse()
                        {
                            return $this->adresse;
                        }
                    
                        /**
                         * @param string $adresse
                         */
                        public function setAdresse(string $adresse)
                        {
                            $this->adresse = $adresse;
                        }
                    
                        /**
                         * @return string
                         */
                        public function getColor()
                        {
                            return $this->color;
                        }
                    
                        /**
                         * @param string $color
                         */
                        public function setColor(string $color)
                        {
                            $this->color = $color;
                        }
                    
                    }





                    -
                    Edité par MaximeDétaille 22 septembre 2017 à 14:56:17

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 septembre 2017 à 15:00:17

                      Le problème est dans meeting.php :

                          /**
                           * @var string
                           *
                           * @ORM\Column(name="nomClub", type="string", length=50, nullable=false)
                           */
                          private $nomClub;

                      Tu indiques explicitement que ta colonne est de type "string", hors, c'est une relation ManyToOne/OneToMany/ManyToMany dont tu as besoin! :)

                      EDIT : de plus, j'imagine que comme tu indiques que tu attends un string et que dans ton $nomClub, tu as un objet, il utilise le __toString() de cet objet pour le sauver en BDD :

                      public function __toString() {
                              return $this->nom;
                      }



                      -
                      Edité par Whouki 22 septembre 2017 à 15:02:19

                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 septembre 2017 à 15:02:46

                        Je viens en effet de m'en apercevoir, pense-tu qu'une relation one to one est ok ?

                        Etant donnée qu'il n'y a qu'un club par meeting et qu'un club peut faire plusieurs meeting 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 septembre 2017 à 15:08:35

                          Je pense que tu viens de répondre toi même à ta question! :D

                          Si un club peut avoir PLUSIEURS meeting, tu ne peux pas faire une relation ONEtoONE :)

                          Tu dois faire une relation Club ONE / MANY meeting.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            22 septembre 2017 à 15:10:12

                            Ok merci pour ton aide précieuse je vais regarder de plus près comment faire tout cela j'espère que tout vas bien se passer :p

                            Je fermerai dès que tout sera good !

                            -
                            Edité par MaximeDétaille 22 septembre 2017 à 16:46:04

                            • Partager sur Facebook
                            • Partager sur Twitter

                            [Symfony] Query Builder dans form selection

                            × 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