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



有人可以指出此查询中缺少的内容吗?不会显示该月的最后一天。

尝试使用(->where('b.create>= :start'),->andWhere('b.create <= :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);

您是否看到在数据库上执行的实际查询?

看起来你使用相同的日期时间;当你执行$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)
;

相关内容

  • 没有找到相关文章

最新更新