Bonjour à tous,

je me retrouve confronté à un problème sous Symfony en ce qui concerne la récupération des sous entités.
Voici le schéma :

http://img4.hostingpics.net/pics/588289Sanstitre1.jpg

Ma question est donc : Comment puis-je faire pour récupérer toutes les annonces à partir d'une région, ou d'un département ? Pour une ville aucun problème, je n'ai qu'à utiliser la méthode générée (de ma classe Ville) getAnnonces().

Merci d'avance pour vos lumières ;)

2 réponses


SimonAndGarfunkel
Réponse acceptée

Bonjour Antonin,

alors tu as plusieurs méthodes pour faire cela.

La première, directement depuis une entité (pas optimisée)

  • Exemple depuis une région
    <?php

        // $region est une instance de ton entité `Region`

        foreach($region->getDepartements as $departement) {
            foreach($departement->getVilles() as $ville) {
                 foreach($ville->getAnnonces() as $annonce) {
                        // Tu obtiens alors toutes les annonces [$annonce] depuis une région
                 }
            }
        }

Le problème avec cette méthode c'est que doctrine (j'imagine que c'est l'ORM que tu utilises) va générer un tas de requêtes SQL dans ton dos ^^. Et vu le type de données que tu manipules, ce nombre va très rapidement augmenté.

Seconde méthode, depuis ton repository (plus obtimisé)

Avec cette méthode, tu vas devoir écrire ta requête (et utiliser les jointures) pour pouvoir récupérer toutes tes annonces en une seule fois.

  • Exemple, récupérer toutes les annonces pour une région donnée

Depuis ton repository Annonce, tu vas créer une méthode getAnnoncesByRegion($region_id)

    <?php

    class AnnonceRepository extends \Doctrine\ORM\EntityRepository
    {
        public function getAnnoncesByRegion($region_id)
        {
            $annonces = $this
                ->createQueryBuilder('annonce')
                ->join('annonce.ville', 'ville')
                ->join('ville.departement', 'departement')
                ->join('departement.region', 'region')
                ->where('region.id = :region_id')
                ->setParameter('region_id', $region_id)
                ->getQuery()->getResult();

                return $annonces;            
        }
    }

Avec cette méthode, tu récupères alors une collection d'entité Annonce qui sont propres à une région.

Pour les autres cas, tu peux imaginer des méthodes du genre getAnnoncesByDepartement($departement_id), getAnnoncesByVille($ville_id), ....

Voilà, j'espère avoir pu t'aider

++

GrandNin
Auteur

Un énorme merci l'ami, plus on planche dessus et plus on s'éloigne de la solution la mieux adaptée.
J'ai donc bien adopté la seconde méthode, car j'avais déjà pensé à la première, mais j'étais convaincu qu'il y avait un autre moyen beaucoup moins lourd.

Encore merci ;)