2013-04-02 26 views
24

Bir Varlık için FormType kullanıyorum ve bir entity field kurarım. Bir ve iki Nerede maddelerini gerekir ve ben the Query Builder page okumak kadarıyla, bu en azından ben bu konuda gitmeli nasıl:Symfony2 Doctrine Expr 'IS NOT NULL'

Ancak
'query_builder' => function ($er){ 
    $qb = $er->createQueryBuilder('p'); 
    $qb 
     ->where($qb->expr()->andx(
      $qb->expr()->in('p', '?1'), 
      $qb->expr()->not(
       $qb->expr()->eq('p.location', 'NULL') 
      ) 
     )) 
     ->setParameter(1, $this->totalScope) 
    ; 
    return $qb; 
}, 

, not(eq('col', 'NULL')) (istenilen sonucu elde değil ve aslında, birlikte hatalar:

cevap

37

kullanabilirsiniz isNotNull "hata Değişmez Beklenen, 'NULL' var":

'query_builder' => function ($er){ 
    $qb = $er->createQueryBuilder('p'); 
    $qb 
     ->where($qb->expr()->andx(
      $qb->expr()->in('p', '?1'), 
      $qb->expr()->isNotNull('p.location') 
     )) 
     ->setParameter(1, $this->totalScope); 

    return $qb; 
}, 
25
Ayrıca çok daha azdır senin querybuilder, içinde DQL kullanabilirsiniz

çirkin IMO. bir kumandadan gelen

Hızlı ve kirli örnek:

$repo = $this->getDoctrine()->getRepository('AcmeBundle:Transaction'); 
$query = $repo->createQueryBuilder('t') 
    ->where('t.timestamp > :timestamp') 
    ->andWhere('t.pinNumber IS NOT NULL') 
    ->setParameter('timestamp', new \DateTime('1 day ago')) 
    ->getQuery() 
; 

kolay tahminimce okumak için.

+3

SQL'i bilenler için öznel olarak ** daha az çirkin olabilir **, ANCAK aynı zamanda daha az taşınabilir **, bu arada ifade yolu veritabanı katmanını tamamen soyutlar. Ben şahsen her zaman ifadeleri kullanıyorum. –

+0

@MarcelBurkhard isNotNull yöntemi: 'public function isNotNull ($ x) {return $ x. 'NULL DEĞİL'; } '' – keyboardSmasher

+3

Ayrıca, 'NULL değil 'DQL ** değil ** SQL, sadece ** gibi taşınabilir **, ama aynı zamanda daha az çirkin **. :) – keyboardSmasher

İlgili konular