2014-09-23 5 views
7

में 'DATE() `का उपयोग करके मुझे सभी पंक्तियां प्राप्त करने की आवश्यकता है जहां DATE(a.when) स्ट्रिंग 2014-09-30 से मेल खाता है।सिद्धांत क्वेरीरीबिल्डर

$builder = $this->em->createQueryBuilder(); 
$builder->select('a') 
     ->from('Entity\Appointment', 'a') 
     ->andWhere('a.when = :date') 
     ->setParameter('date', $date); 

a.when एक पूर्ण DATETIME है; :date केवल string (DATE प्रारूप में) है।

निम्नलिखित और विविधताओं काम नहीं किया:

 ->andWhere('DATE(a.when) = :date') 

Error: Expected known function, got 'DATE' 

क्या सही उपयोग यहाँ है?

+0

संभव डुप्लिकेट [सिद्धांत 2 - एक datetime क्षेत्र की तारीख हिस्सा द्वारा परिणाम फ़िल्टर करें] (http://stackoverflow.com/questions/10824383/doctrine-2 -फिल्टर-परिणाम-दर-ए-डेटाटाइम-फ़ील्ड-डेट-पार्ट) – andy

+0

@andy कोई डुप्लिकेट नहीं है। मैं ** querybuilder ** का उपयोग कर रहा हूं और 'createQuery' और 'querybuilder' का उपयोग कर त्रुटि संदेश समान है:' त्रुटि: अपेक्षित ज्ञात फ़ंक्शन, 'DATE' प्राप्त हुआ। – DanFromGermany

+1

एरो एक जैसा है क्योंकि DQL में कोई 'DATE() 'नहीं है। यदि आप लिंक किए गए डुप्लिकेट से WHERE क्लॉज का उपयोग करते हैं, तो आपके दृष्टिकोण को भी काम करना चाहिए। – andy

उत्तर

7

यह वास्तव में एक बहुत ही आम सवाल है। यह पता चला है कि सभी एसक्यूएल डेटाबेस एक DATE फ़ंक्शन का समर्थन नहीं करते हैं, इसलिए सिद्धांत के प्रभारी अच्छे लोगों ने इसका समर्थन करने का फैसला नहीं किया।

उनकी इच्छा की इच्छा है क्योंकि इससे लोगों का एक समूह काफी प्रयास करेगा।

doctrine: 
    orm: 
    default_entity_manager:  default 
    auto_generate_proxy_classes: %kernel.debug% 

    entity_managers: 

    default: 
     connection: default 
     ... 
     dql: 
     datetime_functions: 
      date: Cerad\Bundle\CoreBundle\Doctrine\DQL\Date 

http://doctrine-orm.readthedocs.org/en/latest/cookbook/dql-user-defined-functions.html http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html http://symfony.com/doc/current/reference/configuration/doctrine.html

:

namespace Cerad\Bundle\CoreBundle\Doctrine\DQL; 

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

class Date extends FunctionNode 
{ 
    public $date; 

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) 
    { 
     return "DATE(" . $sqlWalker->walkArithmeticPrimary($this->date) . ")"; 
    } 
    public function parse(\Doctrine\ORM\Query\Parser $parser) 
    { 
     $parser->match(Lexer::T_IDENTIFIER); 
     $parser->match(Lexer::T_OPEN_PARENTHESIS); 

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

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

तो यह अपने अनुप्रयोग/config.yml के सिद्धांत अनुभाग में तार:

तो अपनी परियोजना के लिए इस बल्कि जादुई वर्ग को जोड़ने

अधिक एसक्यूएल कार्यों के साथ वहां अन्य बंडल हैं। विचित्र रूप से पर्याप्त, पहली बार मैंने कुछ साल पहले देखा, उनमें से कोई भी तिथि परिभाषित नहीं किया गया था। तो मैंने अभी अपना खुद का बना दिया।

============================================== ======================

अद्यतन 01

मैं टैग ध्यान से जाँच करें और मान लिया है कि यह एक Symfony 2 आवेदन नहीं हो सका। तिथि वर्ग वही रहता है। आप सिद्धांत कॉन्फ़िगरेशन ऑब्जेक्ट प्राप्त करके इसे तारित करते हैं।

$config = new \Doctrine\ORM\Configuration(); 
$config->addCustomDatetimeFunction('DATE', 'blahblah\Date'); 

विवरण के लिए सिद्धांत लिंक देखें।

+0

मैं आपको अपने प्रयास के लिए एक उपेक्षा देता हूं, दुर्भाग्यवश मैं सिद्धांत की तरह हमारे मूल libs को नहीं बदल सकता। मैं अब तक एक गैर-डीक्यूएल तरीके से जा रहा हूं जब तक कि मुझे बेहतर तरीका न मिल जाए। – DanFromGermany

+0

आप कोर लाइब्रेरी को नहीं बदल रहे हैं। आप बस एक कस्टम फ़ंक्शन जोड़ रहे हैं। सिद्धांत के अंदर कुछ भी नहीं बदला जा रहा है। – Cerad

+0

मैं इसे "वायर्ड अप" नहीं प्राप्त कर सकता हूं। मेरे पास यह कॉन्फ़िगरेशन फ़ाइल नहीं है।मैंने 'वर्ष()', 'DAY()' और 'माह()' के साथ प्रयास किया क्योंकि अब उनकी कक्षा फाइलें पहले से ही थीं लेकिन त्रुटि तदनुसार वही है .. – DanFromGermany

7

एंडी के लिए धन्यवाद, अब इस का उपयोग करते हुए:

$builder = $this->em->createQueryBuilder(); 
$builder->select('a') 
     ->from('Entity\Appointment', 'a') 
     ->andWhere('a.when > :date_start') 
     ->andWhere('a.when < :date_end') 
     ->setParameter('date_start', $date->format('Y-m-d 00:00:00')) 
     ->setParameter('date_end', $date->format('Y-m-d 23:59:59')); 
की
संबंधित मुद्दे