我需要使用学说来获取,我的实体具有三个日期值,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')

09-25 17:50