2015-06-23 58 views
3

在我的Symfony2項目,我有兩個實體「接觸」和「設置」,以多對多的關係:NOT IN在許多使用Doctrine的QueryBuilder查詢到很多關係

/** 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Settings", cascade={"persist"}) 
* @ORM\JoinColumn(nullable=true) 
*/ 
private $settings; 

實體設置有屬性「parametre」,這是一個簡單的字符串。

現在我想讓所有沒有任何設置的「參數」是「主題」的聯繫人。

我能做到這一點的SQL與像查詢:

SELECT DISTINCT(c.id) FROM contact c WHERE c.id 
NOT IN (SELECT cs.contact_id FROM contact_settings cs 
INNER JOIN Settings s ON s.id = cs.settings_id 
WHERE s.parametre = "THEMES") 

但我無法弄清楚如何與學說的查詢生成器做。 這是我到目前爲止已經試過:

$query = $this->createQueryBuilder('c') 
    ->join('c.settings', 's'); 

$qb2 = $qb; 

$qb2->select('s2') 
    ->from('AppBundle\Entity\Settings', 's') 
    ->where('s2.parametre = :parametre'); 

$query->where(($qb->expr()->notIn('s', $qb2->getDQL()))); 
$query->setParameter('parametre', 'THEMES'); 
$result = $query->getQuery()->getResult(); 

不返回任何結果。

謝謝!

回答

7

你可以嘗試這樣的事情:

$subQueryBuilder = $this->getEntityManager()->createQueryBuilder(); 
$subQuery = $subQueryBuilder 
    ->select(['cs.id']) 
    ->from('AcmeDemoBundle:Contact', 'cs') 
    ->innerJoin('cs.settings', 's') 
    ->where('s.parameter = :parameter') 
    ->setParameter('parameter', 'THEMES') 
    ->getQuery() 
    ->getArrayResult() 
; 

$queryBuilder = $this->getEntityManager()->createQueryBuilder(); 
$query = $queryBuilder 
    ->select(['c']) 
    ->from('AcmeDemoBundle:Contact', 'c') 
    ->where($queryBuilder->expr()->notIn('c.id', ':subQuery')) 
    ->setParameter('subQuery', $subQuery) 
    ->getQuery() 
; 

$result = $query->getResult(); 

這只是一個例子,你的問題。我不能提供完整的例子,因爲我不知道你的實體的結構...

+0

我不能這樣做 - >從('AcmeDemoBundle:ContactSettings','cs'),因爲我沒有ContactSettings實體。我應該有嗎? –

+0

@Lo'是的,當然.. – xurshid29

+0

我必須承認我真的不明白。爲什麼我應該有一個實體不會有任何字段(除了兩個引用的實體)?我一直認爲,如果你需要多對多的關係而沒有任何額外的領域,你不必創建實體,只需要@ORM \ ManyToMany註解。 –

相關問題