多列的Doctrine或Where

时间:2014-09-19 07:55:55

标签: mysql symfony doctrine-orm

我需要使用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();
}

但是我没有得到我期望的结果,我觉得第一个被忽略的条件,我该怎样解决这个问题?

1 个答案:

答案 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')