web-dev-qa-db-fra.com

Comparer les dates entre les heures avec Doctrine

J'ai une application Syfmony2 avec une table qui a un champ de date. Ce champ de date est un type DateTime.

J'ai besoin d'obtenir toutes les entités qui ont la même date que maintenant.

Mais si je le fais:

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

J'obtiens 0 résultat car Doctrine compare l'objet DateTime, et je dois comparer uniquement l'année, le mois et le jour, pas les heures ... uniquement l'objet Date, pas le DateTime.

Une idée? Merci: D

12
user3396420

Je vois cette façon simple:

$now = new \DateTime();

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

puis dans votre référentiel

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

Méthode dans le référentiel

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

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

Il existe une différence entre les types date et datetime dans doctrine.

date: type qui mappe un SQL DATETIME à un PHP objet DateTime.

datetime: type qui mappe un SQL DATETIME/TIMESTAMP à un PHP objet DateTime.

Assurez-vous d'avoir défini le type de colonne sur date au lieu de datetime.

Alternativement - comme solution de contournement - vous pouvez obtenir le jour à partir de la date d'origine1, puis rechercher entre une date du même jour2 -> 00:00:00 et une date du même jour3 -> 23:59:59 en utilisant une méthode de référentiel personnalisé.

1
Nicolai Fröhlich