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