【问题标题】:Expression mysql NOW() in Doctrine QueryBuilderDoctrine QueryBuilder 中的表达式 mysql NOW()
【发布时间】:2012-12-04 01:18:47
【问题描述】:

如何在学说查询构建器中使用表达式mysql NOW()?

【问题讨论】:

    标签: mysql doctrine doctrine-orm doctrine-query


    【解决方案1】:

    在 Doctrine2 中,您必须使用以下之一而不是 NOW()
    这个:

    CURRENT_TIMESTAMP()
    

    或者:

    ...
    createQuery(...'WHERE x.date = :now')
    ->setParameter('now', new \DateTime('now'))
    ...
    

    如果您只需要时间或日期,请使用以下之一: CURRENT_TIME()CURRENT_DATE()

    Documentation can be found here.

    【讨论】:

    • 未找到文档链接报​​告,请更新。
    • 这个 CURRENT_TIMESTAMP() 东西从来没有为我工作过。你能提供一个如何使用它的例子吗?我不想使用网络服务器的时间,而是使用数据库。我总是最终编写原始 SQL(仍然绑定参数)并放弃查询构建器。
    • 还要注意'now'DateTime 的默认参数,所以new \DateTime() 就足够了。
    【解决方案2】:

    使用查询生成器,它看起来像这样:

    $qb
        ->select('B')
        ->from('RandomBundle:Banana', 'B')
        ->where(
            $qb->expr()->gt('B.expiresAt', ':now')
        )
        ->setParameter('now', '\'CURRENT_TIMESTAMP()\'');
    

    注意:参数集上的额外引号需要才能使CURRENT_TIMESTAMP() 函数正常工作。

    或者干脆

    $qb
        ->select('B')
        ->from('RandomBundle:Banana', 'B')
        ->where(
            $qb->expr()->gt('B.expiresAt', 'CURRENT_TIMESTAMP()')
        );
    

    【讨论】:

    • 在第二个示例中,您可以直接在 where 调用中使用较短的 B.expiresAt > CURRENT_TIMESTAMP() 比较,而不是使用查询构建器表达式
    • 我认为希望使用数据库的时间,而不是某些前端 Web 服务器的时间。替代选项是使用resultset mapper/native query,或扩展 Doctrine 并编写自己的 Doctrine\ORM\Query\AST\Functions。
    猜你喜欢
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多