【问题标题】:Check if date already exists in another time period检查日期是否已存在于另一个时间段中
【发布时间】:2015-02-22 17:39:46
【问题描述】:

我有一个页面,管理员可以在其中创建新的时间段。现在,当管理员想要添加一个新时期时,我想检查是否还没有另一个时期。

这是我当前的代码,但我猜 <=>= 不像他们应该在教义中那样工作?

$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,当我在遥远的将来添加一个句点时,它会给我所有行的结果。 我阅读了有关 ltegte 的信息,但我不太清楚如何将其集成到此代码中。

此代码在我的 PeriodBundle 管理员中。

【问题讨论】:

    标签: php symfony doctrine sonata-admin sonata


    【解决方案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'));
      }
      
      
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-24
        • 2020-02-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多