2017-09-18 2 views
1

J'ai ajouté un filtre à mon projet qui fonctionne avec symfony.Filtrage multiple dans Symfony

J'ai l'ID (numéros à rechercher) et le nom du client. Lorsque j'ai construit ma requête avec un paramètre, il fonctionne, comme ça

public function findFilter($filter) 
    { 
     return $this->createQueryBuilder("a") 
      ->andWhere('a.id like :id') 
      ->setParameter('id', '%' . $filter . '%') 
      ->getQuery() 
      ; 
    } 

et quand j'ajouter un paramètre, la recherche ne se produit pas.

public function findFilter($filter) 
    { 
     return $this->createQueryBuilder("a") 
      ->andWhere('a.id like :id') 
      ->setParameter('id', '%' . $filter . '%') 
      ->andWhere('a.client like :client') 
      ->setParameter('client', '%' . $filter . '%') 
      ->getQuery() 
      ; 
    } 

et voici mon avis où le filtre peut être entré

<form action="" method="get"> 
     <input name="filter" type="text"> 
     <button type="submit" class="btn btn-default">Filtrer</button> 
</form> 

Alors peut-être que je ne suis pas les coller à droite? Quelqu'un at-il une idée sur la façon d'ajouter plus de paramètres pour la barre de filtre?

Répondre

3

Si vous souhaitez filtrer sur plusieurs colonnes avec une valeur unique, vous avez à utiliser un tableau de OR filtres.

use Doctrine\ORM\Query\Expr; 

[...] 

$orX = new Expr\Orx(); 
$orX->add($qb->expr()->orx($qb->expr()->like('a.id', ':filter')); 
$orX->add($qb->expr()->orx($qb->expr()->like('a.client', ':filter')); 

$qb 
    ->andWhere($orx) 
    ->setParameter('filter', '%'.$filter.'%') 
; 
+0

Merci pour la réponse –

3

essayez ceci:

return $this->createQueryBuilder("a") 
     ->andWhere('a.id like :id' OR 'a.client like :client') 
     ->setParameters([ 
      'id' => '%' . $filter . '%', 
      'client' => '%' . $filter . '%' 
     ]), 
     ->getQuery(); 
+0

Merci pour la réponse, mais j'ai trouvé avec l'expression qui a résolu le problème. –

2

Vous devez utiliser orWhere au lieu de andWhere

public function findFilter($filter) 
{ 
    return $this->createQueryBuilder("a") 
     ->where('a.id like :filter') 
     ->orWhere('a.client like :filter') 
     ->setParameter('filter', '%' . $filter . '%') 
     ->getQuery() 
    ; 
} 

De plus après getQuery (mais ne sais pas si elle est une faute de frappe ou quelque chose d'autre) vous auriez pu manquer un getResult

+0

Merci pour la réponse, mais j'ai trouvé un meilleur résultat avec l'expression de la requête –

+0

@chickenburger pas de problème. Je voulais juste commenter cela - pour les gens qui liront ceci - qu'il n'y a absolument aucune différence entre cette réponse et la réponse acceptée. Les deux fonctionnent. Accepté on est moins lisible mais c'est ok. Je voulais juste souligner que les deux sont acceptables;) – DonCallisto