Symfony - 如果结束日期为空,则 Doctrine 过滤日期
Symfony - Doctrine filter date if end date is null
我有一个棘手的问题,我正在尝试几天来解决这个问题。
我有报告和订阅。
我指定了一个报告日期..(报告实体有 reportDate 归档)
想法是 return 该特定报告日的一个结果。
然后在查询构建器中,我触发了包含 startDate 和 endDate 的订阅 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)')
我有一个棘手的问题,我正在尝试几天来解决这个问题。
我有报告和订阅。
我指定了一个报告日期..(报告实体有 reportDate 归档)
想法是 return 该特定报告日的一个结果。
然后在查询构建器中,我触发了包含 startDate 和 endDate 的订阅 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)')