Symfony - 如果结束日期为空,则 Doctrine 过滤日期

Symfony - Doctrine filter date if end date is null

我有一个棘手的问题,我正在尝试几天来解决这个问题。

我有报告订阅

我指定了一个报告日期..(报告实体有 reportDate 归档)

想法是 return 该特定报告日的一个结果。

然后在查询构建器中,我触发了包含 startDateendDate 的订阅 table。 想法是在 ReportDate.

日期范围内的订阅中找到 table 行

所以,我正在过滤订阅以找到在给定日期有效的订阅。

在我的表单中,如果我输入 2020-11-01 到 2020-11-10,它会过滤我的自定义 foreach 数组和 return 例外结果。

问题:endDate 是可选的,可以有 NULL 值。 我想要完成的是,如果 endDate IS NULL 过滤从 startDate 到未来的所有结果。现在,当我遍历所有订阅时,结果总是 0 值。

处理方法:

public function getSubscription($reportId, DateTime $reportDate)
{
    $from = new DateTime($reportDate->format("Y-m-d")." 00:00:00");
    $to   = new DateTime($reportDate->format("Y-m-d")." 23:59:59");

    return $this->createQueryBuilder("e")
        ->where('e.reportId =:reportId')
        ->andWhere('e.startDate <= :from')
        ->andWhere('e.endDate >= :to')
        ->setParameter('reportId', $reportId)
        ->setParameter('from', $from)
        ->setParameter('to', $to)
        ->getQuery()
        ->getOneOrNullResult();
}

还尝试添加:

->andWhere('e.endDate >= :to AND (e.endDate IS NULL OR e.endDate >= :to)')

结果是一样的。

你非常接近。你的问题是这样的:只要 e.endDate 为空,e.endDate >= anything 就是假的。

试试这个,简化您在问题中提到的内容。

->andWhere('(e.endDate IS NULL OR e.endDate >= :to)')