Bonjour!
Grâce à l'aide de stealth35, j'ai pu faire une recherche multicritère, ça marche bien mais l'action ne permet de rechercher que l'expression exacte, j'aimerais bien l'améliorer en permettant de rechercher tous les mots d'une expression (chose que j'ai déjà fait en PHP) mais je n'y arrive pas en Sf2. Voici ma démarche :

S'il s'agit d'une recherche de type Expression exacte, j'effectue le traitement nécessaire et ça marche nickel. Maintenant pour une recherche de type Tous les mots, j'essaye de récupérer un tableau avec la fonction explode(), le nombre de mots avec count() et une boucle pour construire la variable requête que je la veux une partie de la rêquette dans le repository.

Mon action :

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
     * Trouver les taches recherchées.
     *
     * @Route("/find", name="tache_find")
     * @Template("TacheBundle:Tache:liste.html.twig")
     */
    public function findAction(Request $request)
    {	
 
       $defaultData = array('message' => 'Type your message here');
       $searchForm = $this->createFormBuilder($defaultData)
        	     ->add('value','text', array('required'=>false/*, 'property_path' => false*/))
                     ->add('valide','checkbox', array('label'     => 'Tâche valide ?','required'  => false/*, 'property_path' => false*/))
                     ->add('type','choice', array('choices' => array('Expression exacte' => 'Expression exacte', 'Tous les mots' => 'Tous les mots', 'Le minimum' => 'Le minimum')))
                     ->getForm();
 
    	if ($request->getMethod() == 'POST') {
    	   $searchForm->bindRequest($request);
	   $data = $searchForm->getData(); 
	   $motcle=$data['value'];
	   $type=$data['type'];
    	   if ($searchForm->isValid()) {
 
    	   	if($type == 'Expression exacte' ){
          		$em = $this->getDoctrine()->getEntityManager(); 
			$taches = $em->getRepository('TacheBundle:Tache')->getExactList($motcle); 
		}
		if($type == 'Tous les mots'){
			$mots=explode(' ', $motcle);
			$nombre_mots = count ($mots);
			for($i=0; $i<$nombre_mots; $i++){
			$requete='';
			$requete.= 'AND tache.priorite LIKE \'%' . $mots[$i] . '%\' OR tache.commentaire LIKE \'%' . $mots[$i] . '%\'';
			}
			$requete = ltrim($requete,'AND'); 
			$em = $this->getDoctrine()->getEntityManager(); 
			$taches = $em->getRepository('TacheBundle:Tache')->getAllList($requete);
			}	   	
    	   }
    	}
 
    return  array('taches' => $taches);
    }
Et ma requête:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
public function getAllList($requete)
	{
		$query = $this->_em->createQuery('SELECT t FROM TacheBundle:Tache t :requete ORDER BY t.priorite');
    		$query->setParameter('requete', $requete);
		return $query->getResult();
	}
Quand j’exécute j'ai l'erreur suivante:
[Syntax Error] line 0, col 34: Error: Expected end of string, got ':requete'
500 Internal Server Error - QueryException
Est-ce que avec DQL on ne peut plus créer de requête avec une partie dynamique ? Si vous avez une autre idée comment faire ce type de recherche (sachant que je dois faire ça à la main) j'en serais reconnaissant Merci bcp!