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的答案是完美的。
謝謝您的回答!這似乎是正確的方法,當我詢問dessinateurs時,這個查詢給出了正確的結果。但是,其他條款似乎被忽略(當我在$ motcle中使用ISBN時,我沒有得到任何結果)。我想這是因爲連接子句不會產生任何結果,但我希望它是可選的:如果沒有dessinateurs,但ISBN(或cote)匹配$ motcle,那麼應該回顧這本書。我應該使用其他連接類型嗎? – nicolasticot
我找到了一個解決方案,我用工作查詢編輯我的原始問題。你的解決方案是我的問題(關於數組屬性)的準確答案,所以這個問題解決了。謝謝 ! – nicolasticot