2017-09-18 66 views
1

我在我的項目中添加了一個與symfony一起使用的過濾器。Symfony中的多重過濾

我有ID(要搜索的號碼)和客戶端名稱。 當我建立我的查詢帶有一個參數,它的工作原理,就是這樣

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

,當我加入一個參數,搜索不會發生。

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() 
      ; 
    } 

,這裏是我的看法,其中過濾器可輸入

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

所以也許我不會堅持他們的權利? 任何人都知道如何添加更多的過濾器參數?

回答

3

如果你想在多個列過濾器的獨特價值,你使用的OR濾光器陣列。

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

感謝您的回答 –

3

試試這個:

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

感謝答案,但我發現解決問題的表達方式。 –

2

您應該使用orWhere代替andWhere

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

而且你可能已經錯過了getResultgetQuery後(但不知道這是否是一個錯字或別的東西)

+0

感謝您的回答,但我發現更好的結果與查詢表達式 –

+0

@chickenburger沒有問題。我只想對此發表評論 - 對於那些會閱讀這篇文章的人來說 - 這個答案和接受的答案絕對沒有區別。兩者都有效。接受一個是不太可讀的imho,但沒關係。只是想指出兩者都可以接受;) – DonCallisto