Compare dates between datetimes with Doctrine

后端 未结 3 472
萌比男神i
萌比男神i 2021-01-01 15:05

I have a Syfmony2 app with a table which has a date field. This date field is a DateTime type.

I need to get all the entities which the same date as now.

But

相关标签:
3条回答
  • 2021-01-01 15:29

    I see this simple way:

    $now = new \DateTime();
    
    $data = $entityRepository->getByDate($now);
    

    then in your repository

    public function getByDate(\Datetime $date)
    {
        $from = new \DateTime($date->format("Y-m-d")." 00:00:00");
        $to   = new \DateTime($date->format("Y-m-d")." 23:59:59");
    
        $qb = $this->createQueryBuilder("e");
        $qb
            ->andWhere('e.date BETWEEN :from AND :to')
            ->setParameter('from', $from )
            ->setParameter('to', $to)
        ;
        $result = $qb->getQuery()->getResult();
    
        return $result;
    }
    
    0 讨论(0)
  • 2021-01-01 15:37

    Method in repository

    public function getDays(\DateTime $firstDateTime, \DateTime $lastDateTime)
    {
        $qb = $this->getEntityManager()->createQueryBuilder()
            ->select('c')
            ->from('ProjectBundle:Calendar', 'c')
            ->where('c.date BETWEEN :firstDate AND :lastDate')
            ->setParameter('firstDate', $firstDateTime)
            ->setParameter('lastDate', $lastDateTime)
        ;
    
        $result = $qb->getQuery()->getResult();
    
        return $result;
    }
    

    And action

    public function calendarAction()
    {
        $currentMonthDateTime = new \DateTime();
        $firstDateTime = $currentMonthDateTime->modify('first day of this month');
        $currentMonthDateTime = new \DateTime();
        $lastDateTime = $currentMonthDateTime->modify('last day of this month');
    
        $days = $this->getDoctrine()
            ->getRepository('ProjectBundle:Calendar')
            ->getDays($firstDateTime, $lastDateTime);
    
        return ['days' => $days];
    }
    
    0 讨论(0)
  • 2021-01-01 15:47

    There is a difference between the date and datetime types in doctrine.

    date: Type that maps a SQL DATETIME to a PHP DateTime object.

    datetime: Type that maps a SQL DATETIME/TIMESTAMP to a PHP DateTime object.

    Make sure you have set the column type to date instead of datetime.

    Alternatively - as a workaround - you could get the day from the original date1 and then search between a same-day date2 -> 00:00:00 and same-day date3 -> 23:59:59 using a custom repository method.

    0 讨论(0)
提交回复
热议问题