2015-04-28 11 views
9

Tôi có ứng dụng Syfmony2 có bảng có trường ngày. Trường ngày tháng này là loại ngày giờ.So sánh ngày giữa các thời điểm với Doctrine

Tôi cần nhận tất cả các thực thể có cùng ngày như bây giờ.

Nhưng nếu tôi làm:

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

tôi nhận được 0 kết quả vì học thuyết là so sánh các đối tượng datetime, và tôi cần phải so sánh chỉ năm, tháng và ngày, không giờ ... chỉ đối tượng Date de , không phải là ngày giờ.

Bất kỳ ý tưởng nào? Thanks: D

Trả lời

19

tôi thấy cách đơn giản này:

$now = new \DateTime(); 

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

sau đó trong kho của bạn

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

Cảm ơn rất nhiều! Rất hữu dụng. – user3396420

+0

Khi bạn đã sẵn sàng chuyển sang cấp độ mã hóa tiếp theo, các bạn có thể đọc bài viết này về đối tượng giá trị và độ chính xác thời gian. http://rosstuck.com/precision-through-imprecision-improving-time-objects – goto

1

Có sự khác biệt giữa các datedatetime loại trong thuyết.

ngày: Loại ánh xạ SQL DATETIME thành đối tượng DateTime PHP.

datetime: Nhập bản đồ SQL DATETIME/TIMESTAMP vào đối tượng DateTime PHP DateTime.

Đảm bảo bạn đã đặt loại cột thành date thay vì datetime.

Cách khác - bạn có thể lấy ngày từ ngày ban đầu1 và sau đó tìm kiếm trong cùng ngày 2 -> 00:00:00 và ngày cùng ngày3 -> 23:59:59 bằng cách sử dụng tùy chỉnh phương pháp lưu trữ.

0

Phương pháp trong kho

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

Và hành động

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