【问题标题】:php zf2 select where clause with SQL functionphp zf2 使用 SQL 函数选择 where 子句
【发布时间】:2015-11-16 21:41:20
【问题描述】:

我需要比较 DATETIME 中的 DATE 格式。

在 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+,它不再工作并产生以下错误:

无法从接口 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())'));

我迷路了,你知道吗?

【问题讨论】:

  • 为我工作。你确定你已经提到了业务的所有细节吗?
  • 我使用的PHP版本可能是:5.3.28
  • 适用于 php 5.6
  • 尝试使用 $where->addPredicate(new Expression('DATE(arrival_time)
  • 您将 \DateTime 对象的时间属性设置为 0。 setTime(0,0,0)

标签: php select zend-framework2 where predicate


【解决方案1】:

只需像这样使用表达式:

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

不需要?就像你试过的那样。和 ?您的参数将被转义,并且不适用于表达式。仅使用参数,例如 PHP 日期时间或类似的东西。

用 2.4.2 测试

【讨论】:

  • 我接受这个答案有两个原因:第一,看起来是 PHP 5.3 导致了这个问题。第二,因为它可以帮助我通过删除“?”来简化代码。现在另一个问题来了:为什么 5.3 会出现这个问题? ZF 2.4.x 是否与此版本不兼容?顺便说一句,这是运行 PHP 5.3 的 Synology
  • 嗯,2.4 与 PHP 5.3 兼容 link ...我不认为 PHP 5.3 有问题...我认为这是因为使用 ?参数正在被转义,你不想要这个。 --- 结果 SQL 带有 ?将是:DATE(arrival_date)
  • 还有一件事……在 2.4 之后,他们引入了 Literal 类型,它被转义了。因此,当您在 WHERE 子句上使用这样的字符串时:$select-&gt;where('DATE(departure_date) &gt;= DATE(NOW())'); ZF2 将使用 Literall 而不是 Expression,因此它将被转义。而你想要一个表达式....
  • 是的,我知道 ZF2 和 5.3 的兼容性。但又一次。在 ZF2.4 之前和之后不工作的代码是我问题中的第一个(3 第一行代码)。所以没有'?'。所以我回到了根本问题.....
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
相关资源
最近更新 更多