2016-07-13 4 views
2

мне нужно запросить статистику по месяцам и/или год, но я получаю эту ошибку:Symfony3 Доктрина findByDate фильтр месяц и/или год

Error: Expected known function, got 'YEAR'

Мой код:

public function findByMonthYear($month, $year) 
{ 
    $qb = $this->createQueryBuilder('p') 
     ->where('YEAR(p.date) = :year') 
     ->andWhere('MONTH(p.date) = :month'); 

    $qb->setParameter('year', $year) 
     ->setParameter('month', $month); 

    return $qb->getQuery()->getOneOrNullResult(); 
} 

С некоторых исследований это показывает, что DQL не имеет функции YEAR(), так что это плата за проезд ... http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/working-with-datetime.html


В конце концов, я не прилипает по нац е решение. Так что, если у вас есть чистый для одного и того же результата, я отвечу на него как на ответ.

коллега сказал мне, что решение в виде следующей крути работы:

where('p.date = :date') 
setParameter('date', ''.$year.'-'.$month.'-%') // 2016-07-% 

Нет успеха до сих пор.

+2

Я рекомендую использовать ** DoctrineExtensions ** bundle (https://github.com/beberlei/DoctrineExtensions). Он добавляет много полезной функции для доктрины. – rokas

ответ

2
public function findByMonthYear($month, $year) 
{ 
    $fromTime = new \DateTime($year . '-' . $month . '-01'); 
    $toTime = new \DateTime($fromTime->format('Y-m-d') . ' first day of next month'); 
    $qb = $this->createQueryBuilder('p') 
     ->where('p.date >= :fromTime') 
     ->andWhere('p.date < :toTime'); 
     ->setParameter('fromTime', $fromTime) 
     ->setParameter('toTime', $toTime); 
    return $qb->getQuery()->getOneOrNullResult(); 
}