2012-11-07 89 views
13

我得到一個奇怪的錯誤,當我執行此DQL查詢:使用日期()函數在WHERE子句中使用DQL

SELECT u FROM User u LEFT JOIN u.schedule s WHERE DATE(s.timestamp) = DATE(NOW()) 

異常是由主義與消息拋出:

Expected known function, got 'DATE' 

該問題看起來與this bug類似,但是它解決了GROUP BY子句中的DATE()函數,並且該錯誤對於Doctrine 2.2是關閉的。在這一刻,我發現了2.4-DEV教條的例外。

該查詢旨在選擇今天計劃的所有用戶。有沒有什麼辦法可以創建這個DQL?我在phpMyAdmin中測試了SQL版本,在那裏查詢不會引發錯誤。什麼可能是錯的?

+1

Doctrine2 DQL沒有DATE()或NOW()函數:http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-functions 。但是你真的想比較兩個時間戳的平等嗎? – memoryleak

+0

我已安排病人預約(日期+時間),我想列出今天的所有病人。有一個醜陋的方式來做到這一點:準備語句與「日期時間」對象爲「今天」。並將日期時間字段拆分爲「日期」和「時間」部分。我可以克服第一個醜陋的部分,但第二個只是因爲抽象層問題而搞砸你的數據庫。所以這就是爲什麼我希望解決方案,這將工作:)我嘗試了'SELECT CAST(s.timestamp作爲日期)作爲schedule_day從... WHERE schedule_day =:今天',但它返回了類似的錯誤... –

回答

31

你可以實現你想要的使用custom function

use Doctrine\ORM\Query\AST\Functions\FunctionNode; 
use Doctrine\ORM\Query\Lexer; 
use Doctrine\ORM\Query\SqlWalker; 
use Doctrine\ORM\Query\Parser; 

class DateFunction extends FunctionNode 
{ 
    private $arg; 

    public function getSql(SqlWalker $sqlWalker) 
    { 
     return sprintf('DATE(%s)', $this->arg->dispatch($sqlWalker)); 
    } 

    public function parse(Parser $parser) 
    { 
     $parser->match(Lexer::T_IDENTIFIER); 
     $parser->match(Lexer::T_OPEN_PARENTHESIS); 

     $this->arg = $parser->ArithmeticPrimary(); 

     $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
    } 
} 

然後註冊該功能在你的代碼:

$em->getConfiguration()->addCustomDatetimeFunction('DATE', 'DateFunction'); 

而且你的DQL的查詢將工作!

+0

WIll試試,謝謝!這可以節省我很多頭痛的地方,我將分開的日期和時間分開預定的時間戳 –

+0

它對我很有用! T4All! –

+7

以下是如何在Symfony2應用程序中註冊新的DQL函數:http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html – Quentin