2014-10-11 88 views
1

使用表結構:學說:多orWhere與LIKE條件

id    | count 
/string/id1  | 3 
/string/id1/r1 | 2 
/string/id1/r2 | 1 
/string/id2/r1 | 2 
/string/id2  | 3 
/string/id2/r1 | 2 
/string/id3/r1 | 5 

,我想選擇哪個都需要在子ID 所有行。
即 我需要它有子中ID的所有行:/串/ ID1/串/ ID2

查詢應該很容易 - 普通的SQL:

select * from table_name where id LIKE '/string/id1%' OR id LIKE '/string/id2%'; 

結果應該是:

id    | count 
/string/id1  | 3 
/string/id1/r1 | 2 
/string/id1/r2 | 1 
/string/id2/r1 | 2 
/string/id2  | 3 
/string/id2/r1 | 2 

不幸的是,如果您嘗試使用相同的查詢在Symfony和doctrine2:

$ids = array('/string/id1', '/string/id2'); 

$query = $this->createQueryBuilder('r') 
       ->select('r'); 
foreach ($ids as $id) { 
    $query->orWhere("r.linkedId LIKE :id ") 
     ->setParameter('id', $id."%"); 
} 
$plainQuery = $query->getQuery()->getSQL(); 
$results = $query->getQuery()->getResult(); 

普通查詢看起來像select * from table_name where id LIKE '/string/id1%' OR id LIKE '/string/id2%';一樣,但結果不是。

結果包含在IDS中最後一個項目的唯一行 - /串/ ID2

id    | count 
/string/id2/r1 | 2 
/string/id2  | 3 
/string/id2/r1 | 2 

如何解決呢?我的錯誤在哪裏?你有什麼建議嗎?

+0

如果您運行原始查詢什麼phpMyAdmin的節目?它是否包含正確的結果?如果是這樣的話,它就像是你的實體的'linkedId'字段上的映射問題。 – 2014-10-11 22:19:12

回答

3

我不能確定,但​​這在我看來像是與參數標識符衝突。

這是你想要做什麼:

  • 構建基本SELECT * FROM table_name聲明
  • 追加WHERE r.linkedId LIKE :id
  • 設置id參數對/string/id1%
  • 值追加OR r.linkedId LIKE :id
  • id參數的值設置爲/string/id2%(覆蓋以前的值)< - AN ERROR

基本上,你告訴學說覆蓋id參數與新的預先定義的值。

你可以很容易地解決這個問題。只需添加$i到參數名

foreach ($ids as $i => $id) { 
    // $i here has the value of 0,1,2, etc... 

    $query->orWhere("r.linkedId LIKE :id$i") // append $i 
     ->setParameter("id$i", $id."%"); // but also append it here 
} 

一定要使用雙引號,或連接("id" . $i)代替;)

+1

你是對的。非常感謝! – sajili 2014-10-12 14:06:00