我需要使用学说来获取,我的实体具有三个日期值,expiryDate,scheduleDate,addedDate(必需)。我需要首先检查是否有今天排定为ScheduleDate的行,如果没有,那么我需要在expiryDate之前检查条目是否具有最新的addDate。
我尝试这段代码,
public function getLatestEntry(){
$today = date("Y-m-d");
$qb = $this->em->createQueryBuilder();
$qb ->select('MyEntry')
->from('MyEntry', 'myEntry')
->Where('myEntry.scheduledOn = :today')
->orWhere('myEntry.expirationDate >= :today')
->orWhere('myEntry.expirationDate is null')
->orderby('myEntry.addedDate')
->setMaxResults(1)
->setParameters(array('today' => $today));
return $qb->getQuery()->getResult();
}
但是我没有得到我期望的结果,我感觉就像第一个条件被忽略的情况,我该如何解决呢?
最佳答案
现在,您有3个条件具有相同的优先级。如果其中之一为真,则将获取该行。但是您希望您的条件具有不同的优先级。第一个匹配或不匹配,第二个匹配。并非您的第三个条件是第二个条件的一部分:
$qb ->select('MyEntry')
->from('MyEntry', 'myEntry')
->Where('myEntry.scheduledOn = :today')
->orWhere('(myEntry.scheduledOn != :today AND (myEntry.expirationDate >= :today OR myEntry.expirationDate IS NULL))')
->orderby('myEntry.addedDate')
->setMaxResults(1)
->setParameters(array('today' => $today));
编辑:
如果您希望将具有到期日期NULL的条目同设置了到期日期的条目一样对待,我不太确定。如果不适合您,则可以更改
ORDER BY
子句,例如->orderby('myEntry.addedDate', 'ASC')
->addOrderBy('my.Entry.expirationDate', 'DESC')