2017-05-30 1 views
0

Comment puis-je sélectionner uniquement les magasins disponibles? Mon entité a un startDateTime et un endDateTime. Les deux champs ont nullable = true.Symfony 2.7 EntityType -> QueryBuilder entre StartDateTime et EndDateTime ou null

Si startDateTime est null, il ne doit pas être pris en compte. La même chose vaut pour endDateTime.

Il essaie, mais il sélectionne uniquement les magasins avec ce départ et enddate:

$builder->add(
    'firstStoreChoice', 
     EntityType::class, 
     [ 
      'class'  => 'MyBundle\Entity\Store', 
      'property'  => 'name', 
      'choice_value' => 'id', 
      'attr'   => ['data-init' => 'select2', 'data-select2-width' => '100%'], 
       'query_builder' => function (EntityRepository $er) { 
        return $er->createQueryBuilder('s') 
         ->where('s.startDateTime is null') 
         ->orWhere('s.startDateTime > :now') 
         ->andWhere('s.endDateTime is null') 
         ->orWhere('s.endDateTime < :now') 
         ->setParameters(['now' => new \DateTime()]); 
       }, 
      ] 
     ); 

Magasin 1: Début: 19/05/2017 09:17:02 Fin: 2017-05- 19 09:17:02

Magasin 2: Début: 01/02/2017 13:53:00 Fin: 2017-02-02 13:53:00

Ces magasins ne sont pas disponibles parce que la date limite est dans le passé. Aujourd'hui c'est 2017-05-30 09:39:00.

Quelqu'un peut-il me pousser dans la bonne direction?

Répondre

1

Vous avez nicher vos conditions:

$qb = $er->createQueryBuilder('s'); 

return $qb 
    ->where(
     $qb->expr()->orX(
      $qb->expr()->lt('s.StartDateTime', 'CURRENT_TIMESTAMP()'), 
      $qb->expr()->isNull('s.StartDateTime') 
     ) 
    ) 
    ->andWhere(
     $qb->expr()->orX(
      $qb->expr()->gt('s.EndDateTime', 'CURRENT_TIMESTAMP()'), 
      $qb->expr()->isNull('s.EndDateTime') 
     ) 
    ); 
+0

Merci pour votre réponse. Mais cela ne fonctionne malheureusement pas. Je n'ai pas de résultats .... bien que j'ai des magasins avec des valeurs nulles dans EndDateTime et un StartDateTime goldlife

+0

ok. c'était de ma faute. ça marche maintenant - je me suis trompé de lt et de gt ... bien sûr que le startdate doit que maintenant. S'il vous plaît mettre à jour votre réponse .. que je vais accepter. – goldlife

+0

Oui, c'était dans ma première version post :) Mise à jour. – miikes