IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

pas possible de faire un inner join avec le query builder


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 275
    Points : 113
    Points
    113
    Par défaut pas possible de faire un inner join avec le query builder
    Bonsoir,

    je tente de faire un querybuilder qui contient un innerjoin, mais je n'arrive pas à aller jusqu'au bout !
    une table animals,
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    class Animals
    {
        /**
         * @ORM\Id
         * @ORM\GeneratedValue
         * @ORM\Column(type="integer")
         */
        private $id;
     
        /**
         * @ORM\Column(type="string", length=255)
         * @Assert\NotBlank(message="vous devez rentrer un nom commun")
         */
        private $commonName;
     
        /**
         * @ORM\ManyToMany(targetEntity=Continents::class, inversedBy="animals")
         * @Assert\Count(min="1", minMessage="vous devez rentrer au moins 1 continent")
         * @ORM\JoinColumn(nullable=false)
         * 
         */
        private $continents;
     
        public function __construct()
        {
            $this->population = new ArrayCollection();
            $this->continents = new ArrayCollection();
        }
     
        /**
         * @return Collection|Continents[]
         */
        public function getContinents(): Collection
        {
            return $this->continents;
        }
     
        public function addContinent(Continents $continent): self
        {
            if (!$this->continents->contains($continent)) {
                $this->continents[] = $continent;
            }
     
            return $this;
        }
     
        public function removeContinent(Continents $continent): self
        {
            $this->continents->removeElement($continent);
     
            return $this;
        }
    }


    une table continents,
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    class Continents
    {
        /**
         * @ORM\Id
         * @ORM\GeneratedValue
         * @ORM\Column(type="integer")
         */
        private $id;
     
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         * 
         */
        private $continentsName;
     
        /**
         * @ORM\ManyToMany(targetEntity=Animals::class, mappedBy="continents")
         */
        private $animals;
     
        public function __construct()
        {
            $this->animals = new ArrayCollection();
        }
     
        public function getId(): ?int
        {
            return $this->id;
        }
     
        public function getContinentsName(): ?string
        {
            return $this->continentsName;
        }
     
        public function setContinentsName(?string $continentsName): self
        {
            $this->continentsName = $continentsName;
     
            return $this;
        }
     
        /**
         * @return Collection|Animals[]
         */
        public function getAnimals(): Collection
        {
            return $this->animals;
        }
     
        public function addAnimals(Animals $animals): self
        {
            if (!$this->animals->contains($animals)) {
                $this->animals[] = $animals;
                $animals->addContinent($this);
            }
     
            return $this;
        }
     
        public function removeAnimal(Animals $animal): self
        {
            if ($this->animals->removeElement($animal)) {
                $animal->removeContinent($this);
            }
     
            return $this;
        }
    }

    une relation many to many et la requête:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    class AnimalsRepository extends ServiceEntityRepository
    {
        public function __construct(ManagerRegistry $registry)
        {
            parent::__construct($registry, Animals::class);
        }
     
        public function findAnimals($species, $diets): array
        {
            $qb = $this->createQueryBuilder('a')
                ->innerJoin('a.continents', 'c', 'WITH', ?? les id de la table animals = les id animals de la table d'association animals_continents)
                ->Where("c.id=1");
     
                $query = $qb->getQuery();
     
                return $query->execute(); 
        }
    }

    Après , symfony me crée une table animals_continents dans ma BDD, mais je n'ai pas d'entité animals_continents ( pas crée automatiquement ).
    Est-ce que c'est ça le problème ? ou c'est moi qui ne comprend pas la doc ( il y des chances ! )
    Merci pour vos réponses, c'est du classique, mais j'avoue ne pas comprendre la doc de Doctrine

    Laurent.

  2. #2
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonsoir,

    Quand tu viens créer une relation ManyToMany, doctrine va venir créer une table entre les deux entités que tu as dans ton code symfony. Tu vas passer de deux tables dans ton code symfony à 3 tables dans le schéma de ta BDD. C'est expliqué ici dans la doc de doctrine, https://www.doctrine-project.org/pro...unidirectional.

    Avec ta requêtes, tu essayes de ressortir toutes les espèces présentes sur un continent ? En lui passant comme paramètre l'id du continent ?

Discussions similaires

  1. Réponses: 7
    Dernier message: 13/12/2007, 13h32
  2. Réponses: 4
    Dernier message: 14/01/2007, 21h57
  3. INNER JOIN avec des données de sélection
    Par EK1_ dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/05/2006, 18h40
  4. [Access 2000] Faire un INNER JOIN derrière un LET JOIN
    Par Korskarn dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/03/2006, 11h51
  5. Es ce possible de faire des inner class en C++?
    Par Eithelgul dans le forum C++
    Réponses: 5
    Dernier message: 14/02/2005, 14h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo