Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 带SQL函数的DQL查询_Php_Sql_Symfony_Doctrine Orm_Dql - Fatal编程技术网

Php 带SQL函数的DQL查询

Php 带SQL函数的DQL查询,php,sql,symfony,doctrine-orm,dql,Php,Sql,Symfony,Doctrine Orm,Dql,我正在将用CodeIgniter编写的简单web应用程序移植到Symfony2包。我是Symfony2和Doctrine的新手,有一个SQL查询有问题,我想用DQL重写。我已经准备好进入我的包,我已经创建了实体类,我能够将数据插入数据库,并以Symfony2提供的面向对象编程方式进行简单查询。不幸的是,我不知道如何在DQL中实现此SQL查询: $sql = "SELECT * FROM t WHERE UNIX_TIMESTAMP(t.date) > ".(time()-300)." A

我正在将用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函数调用需要在数据库服务器上执行。条令无法理解这一要求。当然,我可以选择退出使用条令,在我的Symfony2包中使用基本PDO进行查询,但我希望充分利用使用Symfony2和条令的优势。因此,我希望以面向对象的方式或使用聪明的DQL查询来完成这项工作,该查询可以理解如下内容:

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

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

不幸的是,您不能在DQL查询中使用SQL函数。因此,您有两种选择:

  • 可以在DQL中创建用户定义的函数。这是关于如何做到这一点的官方文件

  • 也可以直接在doctrine中执行SQL查询。以下是在条令中使用本机SQL的官方文档


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

    我知道我遇到的时间有点晚,但如果这能让其他人找到替代解决方案:

    使用捆绑包:

    配置config.yml后:

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