2013-04-02 18 views
24

Używam FormType dla Entity of mine i ustawienie entity field. muszę dwa WHERE w I, iz tego co czytałem na the Query Builder page, to przynajmniej jak ja powinien zabrać:Symfony2 Doctrine 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; 
}, 

Jednak not(eq('col', 'NULL')) nie osiągnąć pożądany rezultat (i faktycznie, błędy z "Error: Oczekiwane dosłowne, dostał 'null'"

Odpowiedz

37

można użyć 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

można również użyć DQL w QueryBuilder, który jest znacznie mniej brzydki IMO.

Szybki i brudny przykład z kontrolerem:

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

łatwiejsze do odczytania w mojej ocenie.

+3

Dla osób, które znają SQL, może to być subiektywnie ** mniej brzydkie **, ALE jest również ** mniej przenośne **, podczas gdy wyrażenia-sposób całkowicie usuwają warstwę bazy danych. Osobiście zawsze używam wyrażeń. –

+0

@MarcelBurkhard Metoda isNotNull: 'public function isNotNull ($ x) {return $ x. "IS NOT NULL"; } ' – keyboardSmasher

+3

Ponadto' IS NOT NULL' to DQL ** nie ** SQL, co czyni go ** równie przenośnym **, ale także ** mniej brzydkim **. :) – keyboardSmasher

Powiązane problemy