【问题标题】:Doctrine DQL query with SQL functions带有 SQL 函数的 Doctrine DQL 查询
【发布时间】:2012-02-25 22:53:40
【问题描述】:

我正在将用 CodeIgniter 编写的简单 Web 应用程序移植到 Symfony2 包。我是 Symfony2 和 Doctrine 的新手,我对一个 SQL 查询有疑问,我想用 DQL 重写。我已经准备好进入我的包,我已经创建了实体类,我能够将数据插入数据库并以 Symfony2 提供的面向对象编程方式进行简单查询。不幸的是,我不知道如何在 DQL 中实现这个 SQL 查询:

$sql = "SELECT * FROM t WHERE 
UNIX_TIMESTAMP(t.date) > ".(time()-300)." AND
ROUND(t.x,3) = ".round($x, 3);

如您所见,有一些 SQL 函数调用需要在数据库服务器上执行。教义无法理解这种呼唤。当然,我可以选择退出使用 Doctrine 并使用 Symfony2 包中的基本 PDO 执行此查询,但我想充分利用 Symfony2 和 Doctrine。因此,我想以 OOP 方式或使用能够理解以下内容的智能 DQL 查询来完成此操作:

$em->createQuery("SELECT t FROM MyTestBundle:MyEntity t WHERE t.x = :x")
->setParameter("x", round($x,3));

但是能够将我的 SQL 查询从旧应用程序重写到我的新包是必须的。请帮我找到正确的解决方案。

【问题讨论】:

    标签: php sql symfony doctrine-orm dql


    【解决方案1】:

    我知道我见面有点晚,但如果这能让对方找到替代解决方案:

    使用捆绑包:Doctrine Extensions

    配置你的 config.yml 后:

    doctrine:
        orm:
            dql:
                string_functions:
                    UNIX_TIMESTAMP: DoctrineExtensions\Query\Mysql\UnixTimestamp
    

    【讨论】:

      【解决方案2】:

      很遗憾,您不能在 DQL 查询中使用 SQL 函数。所以你有两个选择:

      1. 您可以在 DQL 中创建用户定义函数。这是 Doctrine 关于如何做到这一点的官方文档http://docs.doctrine-project.org/en/latest/cookbook/dql-user-defined-functions.html

      2. 或者您可以直接在教义中执行 SQL 查询。这是在 Doctrine 中使用 Native SQL 的官方文档http://docs.doctrine-project.org/en/latest/reference/native-sql.html

      从问题的日期来看,我认为这现在不能帮助你,但我希望它可以帮助有同样问题的其他人

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        • 2013-04-23
        • 1970-01-01
        • 1970-01-01
        • 2017-03-02
        • 1970-01-01
        相关资源
        最近更新 更多