Проверьте, существует ли дата в другом периоде времени

У меня есть страница, где администратор может создавать новые периоды времени. Теперь, когда администратор хочет добавить новый период, я хотел бы проверить, нет ли другого периода уже.

Это мой текущий код, но я думаю, <= а также >= не работают, как они должны в доктрине?

$formMapper->getFormBuilder()->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) {
try {
$from = str_replace('/', '-', $event->getData()['from']);
$to = str_replace('/', '-', $event->getData()['to']);

$dateFrom = new \DateTime($from, new \DateTimeZone('Europe/Amsterdam'));
$dateFrom = $dateFrom->format('Y-d-m');

$dateTo = new \DateTime($to, new \DateTimeZone('Europe/Amsterdam'));
$dateTo = $dateTo->format('Y-d-m');

$query = $this->getModelManager()->createQuery('PeriodeBundle:Periode', 'p');

$query->select()
->where(':from = p.from')
->andWhere(':to = p.to')
->setParameter('from', $dateFrom)
->setParameter('to', $dateTo);

$data = $query->execute();

if (count($data) > 0) {
$event->getForm()->addError(new FormError('This period overwrites another existing period ('
. $data[0]->getFrom()->format('d/m/Y') . ' to '
. $data[0]->getTo()->format('d/m/Y') . ')'));
}
} catch (\Exception $e) {
$event->getForm()->addError(new FormError('Date not valid'));
}});

В моей базе данных у меня несколько упрощенных периодов, например: period_id, from, to

Может ли кто-нибудь указать мне правильное направление?
Мои данные равны NULL, когда я создаю период, который уже существует, и когда я добавляю период в далеком будущем, он дает мне результат всех строк.
Я читаю о lte а также gte но я не совсем понимаю, как интегрировать это в этот код.

Этот код находится у моего администратора моего PeriodBundle.

1

Решение

Я не знаю, как Sonata работает с формами, но я думаю, что вы должны использовать ограничение проверки вместо слушателя. Вот обычный пример формы:

private $em;

public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver
->setDefaults(array(

...

'constraints' => array(
new Callback(
array('callback' => array($this, 'validateForm'))
)
)
));
}

public function validateForm(MyEntity $myEntity, ExecutionContextInterface $context)
{
$valid = true;

$from = str_replace('/', '-', $myEntity->etFrom());
$to = str_replace('/', '-', $myEntity->getTo());

$dateFrom = new \DateTime($from, new \DateTimeZone('Europe/Amsterdam'));
$dateFrom = $dateFrom->format('Y-d-m');

$dateTo = new \DateTime($to, new \DateTimeZone('Europe/Amsterdam'));
$dateTo = $dateTo->format('Y-d-m');

$queryBuilder = $em->createQueryBuilder();

$query = $queryBuilder
->select(array('p'))
->from('PeriodeBundle:Periode', 'p')
->where($queryBuilder->expr()->gte('p.from', ':from'))
->andWhere($queryBuilder->expr()->lte('p.to', ':to'))
->setParameters(array(
'from' => $dateFrom,
'to' => $dateTo
))
->getQuery();

$data = $query->getArrayResult();

if (count($data) > 0) {
$valid = false;
}

// ....

if (!$valid) {
$context
->buildViolation('Invalid....')
->atPath('MYFIELD')
->addViolation()
;
}

}
2

Другие решения

попробуйте использовать метод findBy:

$formMapper->getFormBuilder()->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) {
try {
$from = str_replace('/', '-', $event->getData()['from']);
$to = str_replace('/', '-', $event->getData()['to']);

$dateFrom = new \DateTime($from, new \DateTimeZone('Europe/Amsterdam'));
$dateFrom = $dateFrom->format('Y-d-m');

$dateTo = new \DateTime($to, new \DateTimeZone('Europe/Amsterdam'));
$dateTo = $dateTo->format('Y-d-m');
$periods_list=$this->getModelManager()->getRepository(YourClassPath)->findBy(array('from'=>$dateFrom,'to' =>$dateTo));
if (sizeof($periods_list) > 0) {
$event->getForm()->addError(new FormError('This period overwrites another existing period ('
. $data[0]->getFrom()->format('d/m/Y') . ' to '
. $data[0]->getTo()->format('d/m/Y') . ')'));
}
} catch (\Exception $e) {
$event->getForm()->addError(new FormError('Date not valid'));
}});
0

По вопросам рекламы [email protected]