2015-08-23 41 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,所以它会被转义。你想要一个表达式...... –