web-dev-qa-db-ja.com

Doctrineと日付時刻間の日付を比較します

日付フィールドのあるテーブルを持つSyfmony2アプリがあります。この日付フィールドはDateTime型です。

今と同じ日付のすべてのエンティティを取得する必要があります。

しかし、私がそうするなら:

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

DoctrineはDateTimeオブジェクトを比較し、時間ではなく年、月、日のみを比較する必要があります... DateTimeではなくDateオブジェクトのみを比較する必要があるため、結果は0です。

何か案が?ありがとう

12
user3396420

私はこの簡単な方法を見ます:

$now = new \DateTime();

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

その後、リポジトリで

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

リポジトリ内のメソッド

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

そしてアクション

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

doctrinedateタイプとdatetimeタイプには違いがあります。

date:SQL DATETIMEをPHP DateTimeオブジェクトにマッピングするタイプ。

datetime:SQL DATETIME/TIMESTAMPをPHP DateTimeオブジェクトにマッピングするタイプ。

列タイプをdateではなくdatetimeに設定したことを確認してください。

または、回避策として、元のdate1から日を取得し、カスタムリポジトリメソッドを使用して、同日date2-> 00:00:00と同日date3-> 23:59:59を検索できます。

1