Doctrine DQL查询与SQL函数

6

我正在将使用CodeIgniter编写的简单Web应用程序移植到Symfony2 Bundle中。虽然我已经创建了实体类并能够以面向对象的方式插入数据和执行简单查询,但是由于我对Symfony2和Doctrine不熟悉,因此我在一条SQL查询中遇到了问题,我想将其重写为DQL。遗憾的是,我不知道如何在DQL中实现这个SQL查询:

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

正如你所看到的,有一些需要在数据库服务器上执行的SQL函数调用。Doctrine无法理解这些调用。当然,我有一个选项,可以放弃使用Doctrine,并在Symfony2 bundle内使用基本的PDO执行此查询,但我想充分利用Symfony2和Doctrine的优势。因此,我希望以面向对象的方式完成这个任务,或者使用聪明的DQL查询来理解以下内容:

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

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

2个回答

13

我知道我来晚了一点,但如果这能让其他人找到替代方案:

使用 bundle: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. 或者您可以直接在Doctrine中执行SQL查询。这是Doctrine官方文档关于如何使用本机SQL的链接 http://docs.doctrine-project.org/en/latest/reference/native-sql.html

根据问题上的日期,我不认为这可以帮助您,但我希望它能帮助其他遇到同样问题的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接