Bonjour à tous,

je suis en train de créer un formulaire de recherche avec plusieurs critères sur une entité. Les critères sont bien entendu directement lié à d'autres entités.

j'ai 4 entités: Ensembles.php, Parcsimmobiliers.php, Batiments.php et Typesactivite.php.

Ensembles est relié à Batiments par une relation ManyToOne, donc on retrouve la variable $ensembles dans l'entité Batiments.php.
Typesactivites est relié par une relation ManytoMany dans l'entité Batiments, j'ai donc une table de pivot dans ma base de données phpmyadmin (batiments_typesactivite et non dans mon projet symfony dans le dossier entity comme pour les autres tables, mais jusque là tout va bien), et donc la variable $typesactivite se retrouve dans l'entité Batiments.php.
Pour finir, Parcsimmobilier est relié par une relation ManyToOne dans mon entité Ensembles, sa variable $parcsimmobilier se retrouve dans Ensembles.php.

Voici une requête SQL dont je me suis servi dans ma base de données sur php myadmin:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
SELECT distinct e.nom
FROM `ensembles` e, `parcsimmobilier` p, `batiments` b, `batiments_typesactivite` bta, `typesactivite` ta
WHERE e.parcsimmobilier_id=p.id
AND b.ensembles_id=e.id
AND bta.batiments_id=b.id
AND bta.typesactivite_id = ta.id
AND p.nom="Ville de Dijon"
AND ta.type="Sport"
Le résultat me donne les ensembles appartenant à un parcs immobilier spécifique (Ville de Dijon) ayant des bâtiments qui ont un type d'activité spécifique (Sport).

Je dois adapter cette requête en DQL pour le query builder afin qu'elle me retourne tous les ensembles selon un parc et un typesactivite selectionnés dans un select tag en html.


J'ai donc créer ce formulaire correspondant où je fais appel à trois entités pour faire la recherche (Ensembles en input text, les Parcsimmobilier dans un select et les Typesactivite dans un select), voici le code:
Code : 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
 
class RechercheType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('parcs:', 'entity', array('class' => 'EnexgirDatabaseBundle:Parcsimmobilier', 'property' => 'nom', 'required' => true))
            ->add('typesactivite:', 'entity', array('class' => 'EnexgirDatabaseBundle:Typesactivite', 'property' => 'type',  'required' => false))
            ->add('ensemble', 'text', array('attr' => array('placeholder' => 'rechercher'), 'required' => false))
            ;
 
    }
Le code du controller qui correspond à la méthode rechercher:
Code : 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
 
//METHODE affichage des résultats de recherches
    public function rechercheEnsemblesAction() {
 
        $em=$this->getDoctrine()->getManager();
 
        $message = " Aucuns ensembles ne correspond à votre recherche, veuillez réessayer, merci.";
        $typeactivite = $em->getRepository('EnexgirDatabaseBundle:Typesactivite')->findAll();
        $ensemble = $em->getRepository('EnexgirDatabaseBundle:Ensembles')->findAll();
        $parc = $em->getRepository('EnexgirDatabaseBundle:Parcsimmobilier')->findAll();
        $formRecherche = $this->createForm(new RechercheType());
 
        //si la méthode est bien en POST
        if ($this->get('request')->getMethod() == 'POST' )
        {
            $formRecherche->bind($this->get('request')); //on bind la requête
            $em=$this->getDoctrine()->getManager();
            $ensemble = $em->getRepository('EnexgirDatabaseBundle:Ensembles')->recherche($formRecherche['ensemble']->getdata()); //on affiche le résultat entré dans l'input
 
        } else {
            throw $this->createNotFoundException('Cet ensemble n\'existe pas !');
        }
 
        return $this->render('EnexgirGestionPatrimoinesBundle:Ensembles:rechercheEnsembles.html.twig', array( 'parc' => $parc, 'typesactivite' => $typeactivite, 'ensemble' => $ensemble, 'formRecherche' => $formRecherche->createView() ));
    }
et enfin le repository qui contient le querybuilder pour l'action rechercher :
Code : 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
 
class EnsemblesRepository extends EntityRepository
{
 
    public function recherche($input) //$input est la valeur entrée dans l'input type text recherche
    {
        $qb = $this ->createQueryBuilder('e')
                    ->where('e.nom LIKE :input')
                    ->setParameters(array('input' => "%".$input."%"))
                    ->orderBy('e.nom', 'ASC')
                    ;
 
        //on retourne le résultat
        return $qb->getQuery()->getResult();
    }
 
}
Pour l'instant je n'arrive qu'a un seul résultat avec tout ce j'ai: quoi que je sélectionne, le me rtourne tous les ensembles de ma base de données et ce peu importe mes choix dans les select tag. Je n'arrive pas à construire cette requête en DQL afin d'avoir tous les cas de figure dont j'ai besoin.

Un peu d'aide svp.

Merci d'avance.

Bien à vous...