2013-04-02 59 views
24

我使用了我的一個實體的FormType,並建立一個entity field。 我需要兩個Where子句中的同時,從我讀過關於the Query Builder page,至少這是我應該如何去了解它:Symfony2的學說Expr的「IS NOT NULL」

'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'))沒有達到預期的效果(而事實上,有錯誤「錯誤:預期文字,得到了‘NULL’」

回答

37

您可以使用isNotNull

'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

你也可以在你的QueryBuilder,這是少得多使用DQL 醜陋 IMO。從控制器

快速和骯髒的例子:

$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() 
; 

更容易在我的估計閱讀。

+3

對於瞭解SQL可能主觀上是人少** **難看,但其也少** **便攜,而表情路抽象數據庫層完全程。我個人總是使用表達式。 –

+0

@MarcelBurkhard的isNotNull方法:'公共職能isNotNull($ X){回報$ X。 '不是NULL'; }' – keyboardSmasher

+3

此外,'IS NOT NULL'是DQL ** **不SQL,使其**就像便攜式**,而且**不太難看**。 :) – keyboardSmasher