DQL

2012-11-07 11 views
13

とWHERE句でDATE()関数を使用しますが、私は奇妙なエラーが表示されます。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 。しかし、あなたは本当に彼らの平等の2つのタイムスタンプを比較したいですか? – memoryleak

+0

私はアポイントメント(日付+時間)を予定しており、今日のすべての患者をリストしたいと思います。これを行うには醜い方法があります: "今日"のPHPのDateTimeオブジェクトで文を準備してください。日時フィールドを「日付」と「時刻」の部分に分割します。私は最初の醜い部分を克服することができますが、2番目は抽象レイヤーの問題のためにDBに悩まされています。だからこそ私はこれがうまくいく解決策を望んだのです:)私は 'CAST(s.timestamp as DATE)をschedule_day FROM ... WHERE schedule_day =:today'として試しましたが、同様のエラーを返しました... –

答えて

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