2017-04-18 41 views
0

我遇到了一些問題,可能是一個簡單的問題。在symfony查詢中結合了兩個變量

我需要能夠查詢兩個單獨的變量作爲一個關鍵使用原則,但我不知道是否需要更新實體模式(我寧願不是,似乎矯枉過正)能夠做這個。

我目前需要在一個字段中的單個DQL查詢中查詢多個不同的項目。我一直在做這樣的事情:

 $qb->select('r')->from('Bundle:Reviews\Review', 'r') 
     ->leftJoin('Bundle:Bibliographies\PersonalName', 'p', 'WITH', 'p.biblio = r.id') 
     ->leftJoin('r.biblio', 'bib') 
     ->where('bib.author LIKE ?1 OR p.surname LIKE ?1'); 

到目前爲止這麼好。我遇到的問題是,與包含姓和名的Review實體中的author不同,自動存儲在PersonalName表上(作爲針對Bibliography的一對多存在),因此不存在單個字段。我有姓,但我真正需要的是這樣的:

->where('bib.author LIKE ?1 OR "p.surname", "p.givenName" LIKE ?1'); 

這當然不會工作。

爲了簡便,有沒有辦法做這樣的事情創建是一個複合存儲庫的變量,把它定義爲一個參數(例如$params[3],然後做這樣的事>

->where('bib.author LIKE ?1 OR ?3 LIKE ?1'); 

否則,我可能會被罰款,在實體做,但我不完全知道如何做到這一點

的PersonalName實體有這樣的事情:

/** 
* @var string 
* 
* @ORM\Column(name="given_name", type="string", length=255, nullable=true) 
*/ 
private $givenName; 

/** 
* @var string 
* 
* @ORM\Column(name="surname", type="string", length=255, nullable=true) 
*/ 
private $surname; 

有沒有一種簡單的方法來創建一個新名稱和givenName組合而不必更新實體的新屬性?我一直在試圖找到手冊中的東西,但是,唉,沒有骰子。

任何幫助表示讚賞。

編輯澄清:

我真正需要的是在我的where子句給我這樣的事情:

->where('bib.author LIKE ?1 OR (CONCAT(p.surname,CONCAT(", ",p.givenName)) LIKE ?1)') 

不幸的是,我在那裏得到非常好的效果早些時候姓搜索或作者的子字符串,我現在得到零結果,這對我來說毫無意義,因爲有一個明確的OR。我不確定這是在打破查詢。

+1

我不認爲我明白...爲什麼不只是做'筆者= 1個或姓氏= 1或給定名稱= 1'????如果您需要查詢sur + givenName的組合,您可以添加'OR CONCAT(surname,CONCAT(「」,givenName))=?1「。 – ccKep

+0

@ccKep這看起來像一個好方法(特別是CONCAT部分),但是當我這樣做時,它以某種方式打破了我的查詢並得到零結果。我試過這個' - > where('bib.author LIKE?1 OR(CONCAT(p.surname,CONCAT(「,」,p.givenName))LIKE?1)')'(將OR語句包裝在parens中)但它打破查詢的事實對我來說毫無意義。它不應該至少拉動作者的結果嗎? – nomistic

+0

@cc謝謝!我只是意識到在DQL中單引號內有雙引號存在問題,但你的回答基本上回答了我的問題 – nomistic

回答

0

好了,所以我從上面@ccKep得到的建議寄給我在正確的方向。然而,顯然由於某些原因,DQL不喜歡單引號內的雙引號。

這是爲我工作的解決方案:

->where("bib.author LIKE ?1 OR CONCAT(p.surname,CONCAT(', ',p.givenName)) LIKE ?1") 
1

你可能想嘗試此查詢:

$qb->select('r')->from('Bundle:Reviews\Review', 'r') 
     ->leftJoin('Bundle:Bibliographies\PersonalName', 'p', 'WITH', 'p.biblio = r.id') 
     ->leftJoin('r.biblio', 'bib') 
     ->where($qb->expr()->orX(
      $qb->expr()->like('bib.author', '?1') 
      $qb->expr()->like('p.surname', '?2') 
     )); 

$qb->setParameter(1, $searchTerm); 
$qb->setParameter(2, $searchTerm); 
+0

謝謝,但這並不真正回答我的問題,而且這和我已經做的幾乎完全相同,但是減。我需要同時查詢相同的搜索詞(因此,「?1」兩次)。我可以得到bib.author和p.surname很好;正如我所提到的那樣,這部分工作沒有問題。我需要做的是找到一種方法來將p.surname和p.givenName組合成查詢中的*鍵*。基本上是一個搜索詞(我已經有),但它可以匹配兩個屬性組合爲一個。 – nomistic

+0

那麼,你只需綁定兩次相同的參數。檢查我的編輯。 –

+0

對不起,我不認爲我很清楚。同時獲得bib.author或p.surname我沒有任何問題。我需要能夠得到的是bib.author或者姓名和名字的組合,例如, 「史密斯,約翰」,這樣當有人搜索下「史密斯」或「史密斯,約翰」或「史密斯,J」時,它會帶來準確的結果。問題與提供給查詢的參數無關,問題與密鑰本身有關。審查實體有一個字段,這些字段以姓氏givenName存儲。個人名字沒有。無論如何,我試圖通過連接來處理這個問題 – nomistic