2015-04-28 11 views
9

Mam aplikację Syfmony2 z tabelą, która ma pole daty. To pole daty jest typu datetime.Porównaj daty między datetimes z Doctrine

Potrzebuję uzyskać wszystkie podmioty, które mają tę samą datę, co teraz.

Ale jeśli to zrobię:

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

otrzymuję 0 wyniki, ponieważ doktryna jest porównywanie obiektu datetime i muszę porównać tylko rok, miesiąc i dzień, a nie godzina ... tylko de obiekt Date , a nie datetime.

Każdy pomysł? Dzięki: D

Odpowiedz

19

widzę ten prosty sposób:

$now = new \DateTime(); 

$data = $entityRepository->getByDate($now); 

następnie w repozytorium

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

Wielkie dzięki! Bardzo przydatne. – user3396420

+0

Kiedy jesteś gotowy, aby przejść do następnego poziomu kodowania, możesz przeczytać ten artykuł o dokładności obiektu i czasu. http://rosstuck.com/precision-through-imprecision-improving-time-objects – goto

1

Jest różnica między date i datetime typów w doktryny.

data: typ, który odwzorowuje datetime SQL do obiektu PHP DateTime.

datetime: Typ, który odwzorowuje SQL DATETIME/TIMESTAMP na obiekt PHP DateTime .

Upewnij się, że ustawiono typ kolumny na date zamiast datetime.

Alternatywnie - jako obejście - można uzyskać dzień od pierwotnej daty1, a następnie wyszukać między datą tego samego dnia2 -> 00:00:00 i datą tego samego dnia3 -> 23:59:59 za pomocą niestandardowego metoda repozytorium.

0

Sposób repozytorium

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; 
} 

i działania

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]; 
} 
Powiązane problemy