我需要使用doctrine获取,我的实体有三个日期值,expiryDate,scheduledDate,addedDate(强制)。我需要首先检查是否有任何行具有scheduledDate作为今天,如果没有那么我需要在expiryDate之前检查具有最新addsDate的条目。 我试试这段代码,
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();
}
但是我没有得到我期望的结果,我觉得第一个被忽略的条件,我该怎样解决这个问题?
答案 0 :(得分:0)
现在您有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')