Doctrine2 - 如何在此查询中包含该月的最后一天

时间:2014-03-31 20:23:15

标签: date symfony datetime doctrine-orm

有人可以指出此查询中缺少的内容吗?这个月的最后一天没有出现。

尝试过使用( - > 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);

1 个答案:

答案 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)
;