有人可以指出此查询中缺少的内容吗?这个月的最后一天没有出现。
尝试过使用( - > where('b.created> =:start'), - > andWhere('b.created< =:end')代替BETWEEN但是没有用
public function getPostsByMonth($year, $month)
{
$date = new \DateTime("{$year}-{$month}-01");
$qb = $this->createQueryBuilder('b');
$query = $qb
->where('b.created BETWEEN :start AND :end')
->setParameter('start', $date->format('Y-m-d'))
->setParameter('end', $date->modify('last day of this month')->format('Y-m-d'))
;
return $query->getQuery()->getResult();
}
更改
$date = new \DateTime("{$year}-{$month}-01");
$toDate = clone $date;
$toDate->modify("last day of this month");
$qb = $this->createQueryBuilder('b')
->where('b.created BETWEEN :start AND :end')
->setParameter('start', $date)
->setParameter('end', $toDate);
答案 0 :(得分:2)
您是否看到过对数据库执行的实际查询?
您似乎正在使用相同的DateTime;当你执行$ date-> modify()时,它不会返回一个新对象,而是更改它的内部数据,但它仍然是同一个实例。
此外,当您要求DateTime对象转到last day of this month
时,您最终会进入YYYY-01-31 00:00:00
,这实际上是在月末之前的一天。更改您的时间字符串,使其转到下个月的第一天午夜,这正是您想要的位置:YYYY-02-01 00:00:00
:
$toDate = clone $date;
$toDate->modify("first day of next month midnight");
此外,您不需要格式化它,您可以直接传递DateTime对象,让Doctrine在引擎盖下做艰苦的工作:
$query = $qb
->where('b.created BETWEEN :start AND :end')
->setParameter('start', $date)
->setParameter('end', $toDate)
;