Symfony 2.7 EntityType -> StartDateTime 和 EndDateTime 之间的 QueryBuilder 或 null
Symfony 2.7 EntityType -> QueryBuilder between StartDateTime and EndDateTime or null
我怎样才能 select 只有可用的商店?
我的实体有一个 startDateTime 和一个 endDateTime。两个字段都有 nullable=true.
如果 startDateTime 为 null 则不得考虑。
endDateTime 也是如此。
它尝试这个,但它 select 仅具有此开始和结束日期的商店:
$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()]);
},
]
);
商店 1:
开始时间:2017-05-19 09:17:02
结束:2017-05-1909:17:02
商店 2:
开始时间:2017-02-01 13:53:00
结束: 2017-02-02 13:53:00
这些商店不可用,因为结束日期已过。
今天是2017-05-3009:39:00.
有人可以把我推向正确的方向吗?
你必须嵌套你的条件:
$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')
)
);
我怎样才能 select 只有可用的商店? 我的实体有一个 startDateTime 和一个 endDateTime。两个字段都有 nullable=true.
如果 startDateTime 为 null 则不得考虑。 endDateTime 也是如此。
它尝试这个,但它 select 仅具有此开始和结束日期的商店:
$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()]);
},
]
);
商店 1: 开始时间:2017-05-19 09:17:02 结束:2017-05-1909:17:02
商店 2: 开始时间:2017-02-01 13:53:00 结束: 2017-02-02 13:53:00
这些商店不可用,因为结束日期已过。 今天是2017-05-3009:39:00.
有人可以把我推向正确的方向吗?
你必须嵌套你的条件:
$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')
)
);