2014-09-19 57 views
0

我需要使用原则获取,我的实体有三个日期值,expiryDate,scheduledDate,addedDate(必需)。我需要首先检查是否有任何一行有scheduledDate,如果没有,那么我需要在expiryDate之前检查具有最新addedDate的条目。 我试试这个代码,学说或在哪里为多列

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(); 
} 

但我没有得到的结果我的预期,我觉得第一个where条件已被忽略,我怎样才能解决呢?

+0

你肯定结果是错误的?)你试图执行在工作台此查询? – Trone 2014-09-19 08:08:35

+0

是的我很确定,在工作台上我也得到了相同的 – 2014-09-19 08:47:51

回答

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') 
+0

我还是得到了第三个或者Where条件的结果,在注释掉我得到了正确的结果之后,但是可能有一些条件,expirationDate和scheduledDate可能为null。 – 2014-09-19 11:56:36

+0

如果第一个条件成立,通常情况下它不会成为第二个条件,但在这里发生,它是一个错误? – 2014-09-19 12:09:54

+0

3.条件有点奇怪,看[与NULL比较](http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html)。它不应该添加任何行,因为与'NULL'的比较总是'NULL',所以'CONDITION 1 AND NULL' =='NULL'。我更新我的答案。 – SBH 2014-09-19 12:28:25