Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony2] Jointure

joindre suivant un id

Sujet résolu
    14 septembre 2013 à 0:17:04

    Hum, montre les 2 entités alors.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      14 septembre 2013 à 23:04:56

      Excuse je n'avais pas vu ton message :

      Voilà l'entité Article :

      <?php
      
      namespace Projet\DefautBundle\Entity;
      
      use Doctrine\ORM\Mapping as ORM;
      
      /**
       * Article
       *
       * @ORM\Table()
       * @ORM\Entity(repositoryClass="Projet\DefautBundle\Entity\ArticleRepository")
       */
      class Article
      {
      	/**
           * @ORM\ManyToOne(targetEntity="Projet\UserBundle\Entity\User")
      	 * @ORM\JoinColumn(nullable=false)
           */
      	private $user;
      
      	/**
      	 * @ORM\OneToMany(targetEntity="Projet\DefautBundle\Entity\Redacteur", mappedBy="article")
      	 */
      	private $redacteurs;
      
      
          /**
           * @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=255)
           */
          private $nom;
      
          /**
           * @var \DateTime
           *
           * @ORM\Column(name="date_create", type="datetime")
           */
          private $dateCreation;
      
      	 /**
           * @var integer
           *
           * @ORM\Column(name="statut", type="integer")
           */
          private $statut;
      
      
      
      	public function __construct()
      	{
      		$this->redacteurs	= new \Doctrine\Common\Collections\ArrayCollection();
      		$this->dateCreation	= new \Datetime;
      		$this->statut		= 1;
      	}
      
      
          /**
           * Get id
           *
           * @return integer 
           */
          public function getId()
          {
              return $this->id;
          }
      
          /**
           * Set nom
           *
           * @param string $nom
           * @return Article
           */
          public function setNom($nom)
          {
              $this->nom = $nom;
      
              return $this;
          }
      
          /**
           * Get nom
           *
           * @return string 
           */
          public function getNom()
          {
              return $this->nom;
          }
      
          /**
           * Set dateCreation
           *
           * @param \DateTime $dateCreation
           * @return Article
           */
          public function setDateCreation($dateCreation)
          {
              $this->dateCreation = $dateCreation;
      
              return $this;
          }
      
          /**
           * Get dateCreation
           *
           * @return \DateTime 
           */
          public function getDateCreation()
          {
              return $this->dateCreation;
          }
      
          /**
           * Set user
           *
           * @param \Projet\UserBundle\Entity\User $user
           * @return Article
           */
          public function setUser(\Projet\UserBundle\Entity\User $user = null)
          {
              $this->user = $user;
      
              return $this;
          }
      
          /**
           * Get user
           *
           * @return \Projet\UserBundle\Entity\User 
           */
          public function getUser()
          {
              return $this->user;
          }
      
          /**
           * Set statut
           *
           * @param integer $statut
           * @return Article
           */
          public function setStatut($statut)
          {
              $this->statut = $statut;
      
              return $this;
          }
      
          /**
           * Get statut
           *
           * @return integer 
           */
          public function getStatut()
          {
              return $this->statut;
          }
      
          /**
           * Add redacteurs
           *
           * @param \Projet\DefautBundle\Entity\Redacteur $redacteurs
           * @return Article
           */
          public function addRedacteur(\Projet\DefautBundle\Entity\Redacteur $redacteurs)
          {
              $this->redacteurs[] = $redacteurs;
      		$redacteurs->setArticle($this);
              return $this;
          }
      
          /**
           * Remove redacteurs
           *
           * @param \Projet\DefautBundle\Entity\Redacteur $redacteurs
           */
          public function removeRedacteur(\Projet\DefautBundle\Entity\Redacteur $redacteurs)
          {
              $this->redacteurs->removeElement($redacteurs);
          }
      
          /**
           * Get redacteurs
           *
           * @return \Doctrine\Common\Collections\Collection 
           */
          public function getRedacteurs()
          {
              return $this->redacteurs;
          }
      }
      

      Redacteur :

      <?php
      
      namespace Projet\DefautBundle\Entity;
      
      use Doctrine\ORM\Mapping as ORM;
      
      /**
       * Redacteur
       *
       * @ORM\Table()
       * @ORM\Entity
       */
      class Redacteur
      {
      	/**
           * @ORM\ManyToOne(targetEntity="Projet\DefautBundle\Entity\Article", inversedBy="redacteurs")
      	 * @ORM\JoinColumn(nullable=false)
           */
      	private $article;
      
      
      	/**
           * @ORM\ManyToOne(targetEntity="Projet\UserBundle\Entity\User")
      	 * @ORM\JoinColumn(nullable=false)
           */
      	private $user;
      
          /**
           * @var integer
           *
           * @ORM\Column(name="id", type="integer")
           * @ORM\Id
           * @ORM\GeneratedValue(strategy="AUTO")
           */
          private $id;
      
          /**
           * @var \DateTime
           *
           * @ORM\Column(name="date_join", type="datetime")
           */
          private $dateJoin;
      
      	/**
           * @var integer
           *
           * @ORM\Column(name="statut", type="integer")
           */
          private $statut;
      
      
      	public function __construct()
      	{
      		$this->dateJoin		= new \Datetime;
      		$this->statut		= 1;
      	}
      
      
          /**
           * Get id
           *
           * @return integer 
           */
          public function getId()
          {
              return $this->id;
          }
      
          /**
           * Set dateJoin
           *
           * @param \DateTime $dateJoin
           * @return Redacteur
           */
          public function setDateJoin($dateJoin)
          {
              $this->dateJoin = $dateJoin;
      
              return $this;
          }
      
          /**
           * Get dateJoin
           *
           * @return \DateTime 
           */
          public function getDateJoin()
          {
              return $this->dateJoin;
          }
      
          /**
           * Set statut
           *
           * @param integer $statut
           * @return Redacteur
           */
          public function setStatut($statut)
          {
              $this->statut = $statut;
      
              return $this;
          }
      
          /**
           * Get statut
           *
           * @return integer 
           */
          public function getStatut()
          {
              return $this->statut;
          }
      
          /**
           * Set article
           *
           * @param \Projet\DefautBundle\Entity\Article $article
           * @return Redacteur
           */
          public function setArticle(\Projet\DefautBundle\Entity\Article $article = null)
          {
              $this->article = $article;
      
              return $this;
          }
      
          /**
           * Get article
           *
           * @return \Projet\DefautBundle\Entity\Article 
           */
          public function getArticle()
          {
              return $this->article;
          }
      
          /**
           * Set user
           *
           * @param \Projet\DefautBundle\Entity\User $user
           * @return Redacteur
           */
          public function setUser(\Cq\UserBundle\Entity\User $user)
          {
              $this->user = $user;
      
              return $this;
          }
      
          /**
           * Get user
           *
           * @return \Projet\DefautBundle\Entity\User 
           */
          public function getUser()
          {
              return $this->user;
          }
      }
      

      Merci.


      • Partager sur Facebook
      • Partager sur Twitter
        16 septembre 2013 à 8:32:44

        Je ne vois rien d'anormal, ton problème est vraiment plus qu'étrange.
        • Partager sur Facebook
        • Partager sur Twitter
          16 septembre 2013 à 11:43:32

          Zazou a écrit: > Je ne vois rien d'anormal, ton problème est vraiment plus qu'étrange.

          Moi, ce que je vois, c'est que Doctrine ne trouvant pas de propriété $nb_redacteurs dans l'entité Article, elle met l'entité à l'index 1 0 du tableau, et le nombre que corgato demande à l'index nb_redacteurs. En gros, Doctrine créé un tableau avec l'article et la donnée supplémentaire demandée, un peu comme si c'était une nouvelle entité, et ça me paraît assez normal. As-tu essayé de mettre simplement ce qui suit dans ton ArticleRepository

          $qb = $this->createQueryBuilder('a');
          $qb ->join('a.redacteurs', 'r')
              ->addSelect('r')
              ->orderBy('a.dateCreation');
          Et dans Twig, d'utiliser {{ article.redacteurs.count }} ou {{ article.redacteurs|length }} ?

          -
          Edité par Ymox 28 mai 2018 à 22:34:38

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            16 septembre 2013 à 12:00:40

            Ton code fonctionne mais je ne comprends pas pourquoi !?
            Déjà quand je mets à la place de 'r' 'COUNT(r) AS nb_redacteur çà ne fonctionne pas, encore le double array...

            -
            Edité par Anonyme 16 septembre 2013 à 12:02:18

            • Partager sur Facebook
            • Partager sur Twitter
              16 septembre 2013 à 12:10:32

              corgato a écrit:

              Ton code fonctionne mais je ne comprends pas pourquoi !?

              Ce que j'ai fourni comme code va récupérer les articles ainsi que toutes les données des rédacteurs liées à chacun de ces articles. C'est ce que winzou explique dans son tutoriel, et c'est ce que je te proposais de faire dès le début (et si j'ai bien compris, ce que winzou te conseillais de faire aussi). Avec .count ou |length, tu récupères la taille de la collection de rédacteurs pour un article. Donc le nombre de rédacteurs.

              corgato a écrit:

              Déjà quand je mets à la place de 'r' 'COUNT(r) AS nb_redacteur çà ne fonctionne pas, encore le double array...

              Ymox a écrit:

              Moi, ce que je vois, c'est que Doctrine ne trouvant pas de propriété $nb_redacteurs dans l'entité Article, elle met l'entité à l'index 1 0 du tableau, et le nombre que corgato demande à l'index nb_redacteurs. En gros, Doctrine créé un tableau avec l'article et la donnée supplémentaire demandée, un peu comme si c'était une nouvelle entité

              Et de plus, COUNT(r) n'étant pas une entité… Ce que je veux dire par là, c'est que addSelect() attend le nom d'une entité ou son alias, et éventuellement une liste de ses champs pour une sélection partielle. COUNT(r) et SIZE(r) n'en sont pas. Pour faire un parallèle avec du SQL, addSelect('COUNT(r)') revient plus ou moins à faire SELECT … FROM …, COUNT(r). Tu comprends mieux ?

              -
              Edité par Ymox 16 septembre 2013 à 12:11:48

              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                16 septembre 2013 à 12:23:55

                Ok très bien merci :)

                C'est quand même complexe :p

                Y a t-il une différence ou juste la même chose (l'un pour twig et l'autre pour Symfony) entre .count et |length ?

                • Partager sur Facebook
                • Partager sur Twitter
                  16 septembre 2013 à 12:30:14

                  .count appelle la méthode de la classe Collection, donc vient de Doctrine, tandis que |length est de Twig. Mais les deux se basent sur la fonction PHP count()… Si ta question était pour savoir laquelle était la plus rapide/optimisée, je n'en sais rien :p

                  Edit

                  J'en profite pour placer un lien vers la FAQ

                  -
                  Edité par Ymox 25 septembre 2013 à 8:27:20

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    16 septembre 2013 à 12:39:01

                    ok parfait :)

                    Merci beaucoup pour le complément d'information !

                    EDIT : Je pense à ça ce n'est pas un peu dommage de récupérer toutes les infos de l'entity redacteur pour faire juste un count au final ?

                    -
                    Edité par Anonyme 16 septembre 2013 à 12:40:37

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 septembre 2013 à 12:57:59

                      Oui, en effet. Tu peux faire quelque chose comme ->addSelect('partial r.{id}'), par exemple

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        16 septembre 2013 à 13:45:40

                        Parfait merci a vous tous !
                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 septembre 2013 à 9:44:17

                          Salut,

                          Non ce count n'est pas la bonne solution, car comme Ymox le soulève, tu récupères des données inutiles (tu veux juste le nombre de données, pas les données en elles-mêmes).

                          Je ne vois pas pourquoi tu considère le "double array" comme un "problème" ? Il suffit de regarder sa structure pour comprendre qu'il faut l'utiliser comme ça : {{ article.0.nom }} (au lieu de article.nom) pour accéder aux propriétés, et {{ article.nb_redacteur }} pour accéder au count, tout simplement.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 septembre 2013 à 9:51:29

                            winzou, t'avouera quand même que ce n'est pas normal de devoir faire article.0.nom alors que article.1.nom n'existera absolument jamais. Personnellement ça me dérangerait.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 septembre 2013 à 10:49:10

                              Si c'est normal. Pour chaque article, Doctrine doit te donner 2 informations : l'article en lui-même et son nombre de commentaire. Il n'a pas d'autre choix que de mettre ça dans un tableau avec, ici, 2 entrées. Par défaut le tableau est indexé numériquement, mais tu peux mettre un alias comme il l'a fait pour le COUNT (sans alias, le résultat du count aurait été dans article.1).

                              Par contre, et on est d'accord, c'est un peu chiant car le jour où tu enlèves ce count, tu devras remplacer les {{ article.0.nom }} par {{ article.nom }}. Mais c'est le seul "défaut" de cette méthode et ce n'est pas un "problème".

                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 septembre 2013 à 10:58:46

                                C'est bien dans le sens où c'est chiant que je voulais faire passer ce message. Pour doctrine c'est un comportement normal,  mais a mon sens c'est un problème je trouve. Après ça reste un avis subjectif et personnel :)
                                • Partager sur Facebook
                                • Partager sur Twitter

                                [Symfony2] Jointure

                                × 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