2015-08-23 52 views
0

我需要比較DATETIME中的DATE格式。php zf2 select SQL語句中的where子句

之前ZF 2.3.5,下面的代碼工作正常:

$select->where('DATE(arrival_date) <= DATE(NOW())'); 
    $select->where('DATE(departure_date) >= DATE(NOW())'); 
    $select->where('enable = true'); 

隨着ZF 2.4.2+它不工作了,併產生以下錯誤:

不能繼承previously-從接口Zend \ Db \ Sql \ Predicate \ PredicateInterface繼承或覆蓋常量TYPE_IDENTIFIER

我試過以下(沒有錯誤)。問題是「arrival_date」是DATETIME格式,我只需要與DATE進行比較。

$where = new Zend\Db\Sql\Where(); 
    $where->lessThanOrEqualTo('arrival_date', date('Y-m-d')); 
    $where->greaterThanOrEqualTo('arrival_date', date('Y-m-d')); 
    $where->equalTo('enable', true); 
    $select->where($where); 

理想的情況下,該代碼應工作,但它並不:

 $select->where(new Zend\Db\Sql\Predicate\Expression('DATE(arrival_time) <= ?', 'DATE(NOW())')); 

我輸了,什麼想法?

+0

適合我。你確定你已經提到了業務的所有細節嗎? – akond

+0

也許我使用的是PHP的版本:5.3.28 – David

+0

很適合使用PHP 5.6 –

回答

0

只需使用表達這樣的:

$select->where(
     array(
      new \Zend\Db\Sql\Predicate\Expression("DATE(arrival_date) <= DATE(NOW())") 
     ) 
    ); 

沒有必要的?像你試過的一樣。用?你的參數將會逃脫,它不會用表達式來工作。只有像params一樣,像PHP日期時間或類似的東西。

測試2.4.2

+0

我接受了此答案,原因有兩個:第1,看起來像PHP 5.3導致該問題。第二,因爲它通過刪除「?」來幫助我簡化代碼。現在又出現了一個問題:爲什麼5.3會造成這個問題? ZF 2.4.x是否與此版本不兼容?順便說一句,這是一個運行PHP 5.3的Synology。 – David

+0

那麼,2.4是兼容PHP 5.3 [link](http://framework.zend.com/blog/zend-framework-2-4-0-released.html) ...我不認爲這個問題是與PHP 5.3 ...我認爲這是因爲使用?參數正在逃脫,你不想要這個。 ---結果SQ​​L與?將是:DATE(arrival_date)<='DATE(NOW())'...看? –

+0

還有一件事......在2.4之後,他們介紹了逃脫的Literal類型。所以,當你在WHERE子句中使用這樣的字符串時:'$ select-> where('DATE(departure_date)> = DATE(NOW())');'ZF2將使用Literall而不是Expression,所以它會被轉義。你想要一個表達式...... –