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 ;)
Bonjour Antonin,
alors tu as plusieurs méthodes pour faire cela.
<?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é.
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.
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
++
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 ;)