2014-09-19 26 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