2012-12-19 15 views
23

Im Bu sorguyu üretilmeye çalışılmaktadır:'nereye değil de' doktrini sorgu oluşturucu ile sorguya

SELECT * FROM `request_lines` 
where request_id not in(
select requestLine_id from `asset_request_lines` where asset_id = 1 
) 
doktrin sorgu oluşturucu

, ben de (şu anda

ben seçemezsiniz REQUEST_ID yerde şaşırıp vardır:

$linked = $em->createQueryBuilder() 
     ->select('rl') 
     ->from('MineMyBundle:MineRequestLine', 'rl') 
     ->where() 
     ->getQuery() 
     ->getResult(); 

cevap

33

sorgu oluşturucu ifadeler kullanmak gerekir ve bu sorgu oluşturucu nesneye erişim ihtiyacı anlamına gelir Ayrıca, kodu subsele üretmek eğer yazmak için daha kolaydır. vaktinden ct listesi:

$qb = $em->createQueryBuilder(); 

$nots = $qb->select('arl') 
      ->from('$MineMyBundle:MineAssetRequestLine', 'arl') 
      ->where($qb->expr()->eq('arl.asset_id',1)) 
      ->getQuery() 
      ->getResult(); 

$linked = $qb->select('rl') 
      ->from('MineMyBundle:MineRequestLine', 'rl') 
      ->where($qb->expr()->notIn('rl.request_id', $nots)) 
      ->getQuery() 
      ->getResult(); 
+0

bir sorguda bu mümkün değil mi kontrol edin? – Wilt

+1

Evet, aşağıdaki cevabımı kontrol edin ... – Wilt

+0

Yea, Wilt'ın yaklaşımını kullanın – Lighthart

21

Biri Doktrin sorguda bunu yapmak mümkündür:

$qb = $this->_em->createQueryBuilder(); 
$sub = $qb; 

$sub = $qb->select('arl') 
      ->from('$MineMyBundle:MineAssetRequestLine', 'arl') 
      ->where($qb->expr()->eq('arl.asset_id',1)); 

$linked = $qb->select('rl') 
      ->from('MineMyBundle:MineRequestLine', 'rl') 
      ->where($qb->expr()->notIn('rl.request_id', $sub->getDQL())) 
      ->getQuery() 
      ->getResult(); 

reference in this answer here

+2

Açıkçası, bu cevabı kendiminkine tercih ediyorum – Lighthart

+1

@Lighthart Lol :) İsterseniz beğenebilirsiniz ... – Wilt

+0

Harika çözüm, teşekkürler! Bu aynı yaklaşım mantıksal olarak beklediğiniz yerde kullanılabilir - - nerede ($ qb-> expr() -> eq ('x1.some_id', $ sub-> getDql())) 'çalışmak için, ancak' > eq (...) 'veya' -> neq (...) 'bir değişmez bekler. Sadece - - (()) veya '-> notIn (...)' seçeneğini kullanın ve alt sorgunun sonuçlarını tek bir dönüş değeriyle sınırlayın. – iisisrael

İlgili konular