带有SQL函数的Doctrine DQL查询

Dar*_*ski 5 php sql dql symfony doctrine-orm

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

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

正如您所看到的,有一些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));
Run Code Online (Sandbox Code Playgroud)

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

Sno*_*zer 11

我知道我遇到的有点迟了但是如果这允许对方找到另一种解决方案:

使用bundle:Doctrine Extensions

配置config.yml之后:

doctrine:
    orm:
        dql:
            string_functions:
                UNIX_TIMESTAMP: DoctrineExtensions\Query\Mysql\UnixTimestamp
Run Code Online (Sandbox Code Playgroud)


小智 -2

遗憾的是,您无法在 DQL 查询中使用 SQL 函数。所以你有两个选择:

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

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

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