2014-01-23 78 views
4

我試圖用SF2/Doctrine Querybuilder爲搜索字段構建一個請求。QueryBuilder:循環中的參數

在我的搜索字段中,我希望能夠鍵入幾個關鍵字,並獲得與所有關鍵字匹配的結果。

所以,這裏是我的代碼(庫):

foreach ($keywordsArray as $keyword) 
    { 
     $qb->andWhere($qb->expr()->orX(
      $qb->expr()->like('p.name', ':keyword'), 
      $qb->expr()->like('p.surname', ':keyword')      
     )); 
     $qb->setParameter('keyword', '%'.$keyword.'%'); 
     var_dump($keyword); 
    } 

問題:參數 '關鍵字' 始終是$ keywordsArray的最後一個元素...

因此,例如,當我在搜索欄中輸入 「約翰·史密斯」,我有:

$ keywordsArray

array (size=2) 
    0 => string 'John' (length=4) 
    1 => string 'Smith' (length=5) 

循環內的var_dump($關鍵字)告訴我$ keyword = John,然後$ keyword = Smith。

,Symfony的分析器告訴我執行的查詢是:

SELECT [...] 
FROM [...] 
WHERE (l0_.name LIKE '%Smith%' OR a1_.surname LIKE '%Smith%') 
AND (l0_.name LIKE '%Smith%' OR a1_.surname LIKE '%Smith%') 

我所期待的是:

SELECT [...] 
FROM [...] 
WHERE (l0_.name LIKE '%John%' OR a1_.surname LIKE '%John%') 
AND (l0_.name LIKE '%Smith%' OR a1_.surname LIKE '%Smith%') 

你有什麼解釋/解決方案?我應該修改什麼來解決問題?

回答

7

您應使用唯一的參數名稱,例如:

foreach ($keywordsArray as $id => $keyword) 
{ 
    $qb->andWhere($qb->expr()->orX(
     $qb->expr()->like('p.name', ":keyword_".$id), 
     $qb->expr()->like('p.surname', ":keyword_".$id)      
    )); 
    $qb->setParameter("keyword_".$id, '%'.$keyword.'%'); 
} 

因爲你每次都用新的價值

+0

工作完全取代keyword,謝謝。但爲什麼你編輯你從「:keyword _」。$ id回答「:keyword_ $ id」?第一部作品,不是第二部作品。 – Blacksad

+0

您可以使用或「::關鍵字_」。$ id'或'「:keyword_ $ id」'。這一切都必須工作。我喜歡秒,因爲它沒有連接,但你一定要用雙引號! –

+0

哼,我得到'[Syntax Error] line 0,col 112:錯誤:預期的字符串結束,當我嘗試第二個時得到'$''。不過,我對第一個沒有問題,謝謝:-) – Blacksad