2012-02-03 111 views
4

我將使用CodeIgniter編寫的簡單Web應用程序移植到Symfony2 bundle。我是Symfony2和Doctrine的新手,我想在一個DQL中重寫一個SQL查詢。我已經準備好進入我的包中,創建了Entity類,並且能夠將數據插入到數據庫中,並以Symfony2提供的面向對象編程方式進行簡單的查詢。不幸的是,我不知道如何實現這DQL SQL查詢:使用SQL函數的Doctrine DQL查詢

$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的優勢。所以我想在面向對象的方式或使用聰明的DQL查詢理解是這樣完成的:

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

,但能夠從舊的應用程序我的SQL查詢重寫我的新包是必須的。請幫助我找到正確的解決方案。

回答

-1

不幸的是,你不能在DQL查詢中使用SQL函數。所以,你有2種選擇:

  1. 您可以創建DQL一個用戶定義函數。這裏是關於如何做到這一點的Doctrine的官方文檔http://docs.doctrine-project.org/en/latest/cookbook/dql-user-defined-functions.html

  2. 或者你可以直接在doctrine中執行SQL查詢。下面是使用本地SQL教義http://docs.doctrine-project.org/en/latest/reference/native-sql.html

通過對這個問題的日期來看,我不認爲這可以幫助你,但現在我希望它可以幫助別人有同樣的問題,官方文檔

9

我知道我遇到一個有點晚,但如果這可以讓對方找到一個替代的解決方案:

使用捆綁:Doctrine Extensions

配置成功後,您的config.yml:

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