2012-08-12 17 views
20

Belirli bir hizmette olmayan üyeleri seçmek istiyorum. Ben 3 tablolar vardır:Doctrine2'deki alt sorgu Notin Function

  • membre
  • service
  • membre_service (membre ve service arasındaki ilişki)

Ben doktrini 2 kullanıyorum ve SQL benim sorgu:

SELECT m.* FROM membre m WHERE m.`id` NOT IN (
    SELECT ms.membre_id FROM membre_service ms WHERE ms.service_id != 29 
) 

Doktrinde, ben d o: Aynı takma

$qb = $this->_em->createQueryBuilder(); 
$qb2 = $qb; 
$qb2->select('m.id') 
    ->from('Custom\Entity\MembreService', 'ms') 
    ->leftJoin('ms.membre', 'm') 
    ->where('ms.id != ?1'); 

$qb = $this->_em->createQueryBuilder(); 
$qb->select('mm') 
    ->from('Custom\Entity\Membre', 'mm') 
    ->where($qb->expr()->notIn('mm.id', $qb2->getDQL()) 
); 
$qb->setParameter(1, $service); 
$query = $qb->getQuery(); 

return $query->getResult(); 

İdeal birçok çoğa kullanmalıdır aynı sorguda 2 kez tanımlanamaz

Semantical Error] line 0, col 123 near 'm WHERE ms.id': Error: 'm' is already defined.

cevap

35

:

$qb = $this->_em->createQueryBuilder(); 
$qb2 = $qb; 
$qb2->select('m.id') 
     ->from('Custom\Entity\MembreService', 'ms') 
     ->leftJoin('ms.membre', 'm') 
     ->where('ms.id != ?1') 
     ->setParameter(1, $service); 

    $qb = $this->_em->createQueryBuilder(); 
    $qb->select('m') 
     ->from('Custom\Entity\Membre', 'm') 
     ->where($qb->expr()->notIn('m.id', $qb2->getDQL()) 
    ); 
    $query = $qb->getQuery(); 
    //$query->useResultCache(true, 1200, __FUNCTION__); 

    return $query->getResult(); 

aşağıdaki hata var Varlığınız için ilişki, bu durumda sorgunuz çok daha basit olacaktır. Eğer siz de aşağıdaki yapabileceğini Symfony2'nin depo sınıfını kullanırken Aslında eğer

+0

Cevabınız için teşekkür ederiz! MembreService çoktan çoğa çoktan ... Gerçekten bana yardım ettin! Ve son cevap için benim düzenlememi gör. Tanrı sizi korusun ... –

+0

Alt sorguda parametreler kullanıyorsanız: $ qb-> setParameters ($ qb2-> getParameters()); Dış sorgudan parametreleri geçersiz kılmak için $ qb-> setParameters (array_merge ($ qb2-> getParameters(), $ qb-> getParameters())) isteyebilirsiniz. – Omn

+0

Hmmm ... son yorumumu sadece birtakım dokularda çalışıyormuş gibi görünen bir tuz tohumu ile al ... diğer versiyonlarda setParameters yerine değiştiren parametreler ... – Omn

11

:

$in = $this->getEntityManager()->getRepository('Custom:MembreService') 
    ->createQueryBuilder('ms') 
    ->select('identity(ms.m)') 
    ->where(ms.id != ?1); 

$q = $this->createQueryBuilder('m') 
    ->where($q->expr()->notIn('m.id', $in->getDQL())) 
    ->setParameter(1, $service); 

return $q->getQuery()->execute(); 
+0

Bunun için teşekkürler. Bunu farklı depolarla yapmanın bir yolunu arıyordum, çözümün hile yaptı. – mason81

+0

$ q-> expr() 'da, $ q' nedir? – psylosss

+1

$ q, QueryBuilder'ın bir örneğidir. Doğru kod şöyle görünecektir: '' $ q = $ this-> createQueryBuilder ('m'); $ Q> nerede ($ q> expr() -> notin() ....)) '' ' – versedi

4

kullanabilirsiniz (NOT) MEMBER OF:

<?php 
$query = $em->createQuery('SELECT m.id FROM Custom\Entity\Membre WHERE :service NOT MEMBER OF m.services'); 
$query->setParameter('service', $service); 
$ids = $query->getResult(); 

fazla örnek için documentation bakınız.