DQL

2012-11-07 16 views
13

के साथ एक कहां खंड में एक तिथि() फ़ंक्शन का उपयोग करें जब मैं इस DQL क्वेरी निष्पादित मैं एक अजीब त्रुटि मिलती है:DQL

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

अपवाद संदेश के साथ सिद्धांत से फेंक दिया जाता है:

Expected known function, got 'DATE' 

समस्या this bug के समान दिखती है, लेकिन यह DATE() फ़ंक्शन को ग्रुप बाय क्लॉज में संबोधित करती है और बग सिद्धांत 2.2 के लिए बंद है। इस समय, मुझे सिद्धांत 2.4-डीवी के साथ अपवाद मिलता है।

क्वेरी आज के लिए निर्धारित सभी उपयोगकर्ताओं का चयन करने के लिए है। क्या मैं इस डीक्यूएल को बना सकता हूं? मैंने phpMyAdmin में SQL संस्करण का परीक्षण किया और वहां क्वेरी कोई त्रुटि नहीं उठाती है। क्या गलत हो सकता है?

+1

सिद्धांत 2 डीक्यूएल में DATE() या अब() फ़ंक्शन नहीं है: http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql- फ़ंक्शन । लेकिन क्या आप वास्तव में अपनी समानता पर दो टाइमस्टैम्प की तुलना करना चाहते हैं? – memoryleak

+0

मैंने रोगियों को नियुक्ति के लिए निर्धारित किया है (दिनांक + समय) और मैं आज के लिए सभी मरीजों को सूचीबद्ध करना चाहता हूं। ऐसा करने के लिए एक बदसूरत तरीका है: "आज" के लिए एक php 'DateTime 'ऑब्जेक्ट के साथ कथन तैयार करें। और डेटाटाइम फ़ील्ड को "दिनांक" और "समय" भाग में विभाजित करें। मैं पहले बदसूरत भाग को दूर कर सकता हूं, लेकिन दूसरा सिर्फ आपके डीबी के साथ खराब हो रहा है क्योंकि एक अमूर्त परत समस्या है। इसलिए यही कारण है कि मैंने एक ऐसे समाधान की आशा की जहां यह काम करेगा :) मैंने 'SELECT CAST (DATE के रूप में s.timestamp) को शेड्यूल से दिन के रूप में आजमाया ... जहां शेड्यूल_डे =: आज' लेकिन यह एक समान त्रुटि लौटा ... –

उत्तर

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

यहां एक सिम्फनी 2 ऐप में नया DQL फ़ंक्शन पंजीकृत करने का तरीका बताया गया है: http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html – Quentin

संबंधित मुद्दे