2016-12-28 75 views
3

其實我有兩個實體A和B,通過多對多關係映射。 Doctrine使用DQL可以訪問A.bElements和B.aElements屬性來表示這種關係,所以我想在我的查詢中使用這些屬性,因爲此查詢包含其他where子句,並且在同一查詢中執行所有工作看起來不錯。IN子句等價的數組屬性

我有一個子查詢返回一些B元素,我想檢查是否至少存在A.bElements中的這些元素之一。問題是IN子句只適用於一個值,而不是數組。

這裏是我的查詢的示例(這是搜索引擎):

$qb->select('l') 
    ->from('AppBundle:Livre', 'l') 
    ->where("l.ISBN LIKE :motcle") 
    ->orWhere("l.cote LIKE :motcle") 
    ->orWhere($qb->expr()->in('l.dessinateurs', 
     $em->createQueryBuilder() 
      ->select('d.id') 
      ->from('AppBundle:Artiste', 'd') 
      ->where('d.dessinateur=1') 
      ->andWhere('d.nom LIKE :motcle OR d.prenom LIKE :motcle') 
      ->setParameter('motcle', '%'.$motcle.'%') 
      ->getDql() 
    )) 
    ->setParameter('motcle', '%'.$motcle.'%'); 

在這裏,我想這些都是子查詢結果中的至少一個在其l.dessinateurs財產所有的「Livre的」實體。

我知道可以通過單獨回收所有B和A元素來實現這項工作,然後使用php來檢查是否存在常見元素。也可以使用連接表,但我認爲Doctrine旨在避免直接使用這樣的表。

也許有人可以幫助我嗎?也許這個問題還不夠清楚,如有必要,我可以嘗試重新制定。提前致謝。

編輯:

下面的查詢工作正常:

$qb->select('l') 
    ->from('AppBundle:Livre', 'l') 
    ->join('l.serie', 's') 
    ->join('l.editeur', 'e') 
    ->join('l.dessinateurs', 'd', 'WITH', 
     'd.nom LIKE :motcle 
     OR d.prenom LIKE :motcle 
     OR l.ISBN LIKE :motcle 
     OR l.cote LIKE :motcle 
     OR l.etat LIKE :motcle 
     OR l.edition LIKE :motcle 
     OR s.libelle LIKE :motcle 
     OR e.nom LIKE :motcle') 
    ->join('l.auteurs', 'a', 'WITH', 
     'a.nom LIKE :motcle 
     OR a.prenom LIKE :motcle 
     OR l.ISBN LIKE :motcle 
     OR l.cote LIKE :motcle 
     OR l.etat LIKE :motcle 
     OR l.edition LIKE :motcle 
     OR s.libelle LIKE :motcle 
     OR e.nom LIKE :motcle') 
    ->setParameter('motcle', '%'.$motcle.'%'); 

不幸的是我不得不重複其他人一樣子句中都加入,但這是另外一個問題。下面的ccKep的答案是完美的。

回答

1

你可以給這個一杆:

$qb->select('l') 
    ->from('AppBundle:Livre', 'l') 
    ->join('l.dessinateurs', 'd', 'WITH', 'd.dessinateur=1 AND (d.nom LIKE :motcle OR d.prenom LIKE :motcle)') 
    ->where("l.ISBN LIKE :motcle") 
    ->orWhere("l.cote LIKE :motcle") 
    ->setParameter('motcle', '%'.$motcle.'%'); 
+0

謝謝您的回答!這似乎是正確的方法,當我詢問dessinateurs時,這個查詢給出了正確的結果。但是,其他條款似乎被忽略(當我在$ motcle中使用ISBN時,我沒有得到任何結果)。我想這是因爲連接子句不會產生任何結果,但我希望它是可選的:如果沒有dessinateurs,但ISBN(或cote)匹配$ motcle,那麼應該回顧這本書。我應該使用其他連接類型嗎? – nicolasticot

+0

我找到了一個解決方案,我用工作查詢編輯我的原始問題。你的解決方案是我的問題(關於數組屬性)的準確答案,所以這個問題解決了。謝謝 ! – nicolasticot