2012-05-21 4 views
11

मैं उन वस्तुओं को प्राप्त करना चाहता हूं जो आजकल क्वारीबिल्डर द्वारा Doctrine2 से बनाए गए थे। मैं आज पैरामीटर (दिनांक) के साथ बनाया गया एट (डेटाटाइम) फ़ील्ड की तुलना करना चाहता हूं। क्या यह एक प्रश्न में करना संभव है?दिनांक के साथ Doctrine2 से डेटाटाइम फ़ील्ड की तुलना कैसे करें?

$qb = $this->createQueryBuilder('i'); 
$qb->innerJoin('i.type', 'it'); 
$qb->andWhere('it.name = :type'); 
$qb->andWhere('i.createdAt < :today'); 
// i.createdAt == datetime and :today parameter is a date 

उत्तर

19

एक विचार तारीख से निकालने के लिए है के साथ दिनांक समय के लिए तिथियों की तुलना कर सकते हैं। और फिर

$qb->select('p') 
    ->where('YEAR(p.postDate) = :year') 
    ->andWhere('MONTH(p.postDate) = :month') 
    ->andWhere('DAY(p.postDate) = :day'); 

$qb->setParameter('year', $year) 
    ->setParameter('month', $month) 
    ->setParameter('day', $day); 

माह दिन, और वर्ष तुम बाहर DoctrineExtensions

उदा से ले

DoctrineExtensions

यह मेरे लिए काम करता है। ..... day.php, month.php और year.php

आप महीने के जैसे मिलती है:: आप केवल फाइलों की जरूरत

$datetime = new \DateTime("now"); 
    $month = $datetime->format('m'); 
    echo $month; 

कॉपी day.php, month.php और साल। अपने बंडल Xy \ TestBundle \ DQL लिए php

doctrine: 


orm: 
    auto_generate_proxy_classes: %kernel.debug% 
    entity_managers: 
     default: 
      auto_mapping: true 
      dql: 
       datetime_functions: 
        month: Xy\TestBundle\Dql\Month 
        year: Xy\TestBundle\Dql\Year 
        day: Xy\TestBundle\Dql\Day 
+1

यह काम कर रहा है, लेकिन यह थोड़ा गंदा है। क्या आपको पता है कि QueryBuilder के लिए DATE() फ़ंक्शन इस बंडल के साथ प्रदान किया गया है? – gperriard

+1

@jooyce वहाँ नहीं है। [यहां] (https://github.com/simukti/DoctrineExtensions/tree/master/lib/DoctrineExtensions/Query/Mysql) –

+0

उपलब्ध एक्सटेंशन की सूची है यह अभी भी केवल MySQL और Oracle के लिए काम करता है? –

5

आप QueryBuilder today पैरामीटर आपकी क्वेरी में जोड़ने के लिए है। वर्ष, माह और दिन:

$today = new \DateTime(); 
$qb->setParameter('today', $today->format('Y-m-d')); 
QueryBuilder साथ

, आप प्रारूप 'Y-m-d'

+0

मैं $ आज> प्रारूप ('YM-प') पैरामीटर के रूप में के साथ प्रबंधित करने की कोशिश की, लेकिन मैं नहीं मिल गया है परिणाम। मुझे 'createAt' फ़ील्ड के लिए केवल 'वाई-एम-डी' प्राप्त करने की आवश्यकता है। – gperriard

+0

क्या आपने पैरामीटर के रूप में 'डेटटाइम' ऑब्जेक्ट को सीधे पास करने का प्रयास किया है? – Florian

+0

हां, लेकिन यह वही मूल्य नहीं है (जब मैं उनकी तुलना करता हूं तो मुझे झूठा लगता है) और यह वही नहीं है जो मैं चाहता हूं। मैं उन वस्तुओं को प्राप्त करना चाहता हूं जो उसी दिन बनाए गए थे, लेकिन किसी भी समय। i।बनाया गया = 2012-05-21 13:18:27 $ आज = ​​2012-05-21 14:23:34 – gperriard

13

ऐसा नहीं है कि इस तरह के एक परिपक्व ORM DATE समारोह प्रदान नहीं करता है दुर्लभ है के साथ एप्लिकेशन \ config.yml में नए कार्यों रजिस्टर। हालांकि, एक datetime क्षेत्र से बाहर एक तिथि पाने के लिए, अगर आप इस तरह SUBSTRING समारोह लागू कर सकते हैं:

SELECT SUBSTRING(i.dateTimeField,1,10) FROM tableName i 

आशा है कि यह मदद करता है!

+0

आपके लिए उत्तर दिया गया जवाब! बहुत मदद करता है! –

+0

हैकी फिक्स की तरह, जब तक कि DATE फ़ंक्शन सिद्धांत द्वारा समर्थित न हो! धन्यवाद, –

11

तिथि के लिए सिद्धांत विस्तार जोड़ने से बेहतर विकल्प है।

$today_startdatetime = \DateTime::createFromFormat("Y-m-d H:i:s", date("Y-m-d 00:00:00")); 
$today_enddatetime = \DateTime::createFromFormat("Y-m-d H:i:s", date("Y-m-d 23:59:59")); 

अब उन्हें क्वेरी में उपयोग करें::

सबसे पहले आप को पाने के लिए शुरू datetime और अंत दिनांक जरूरत

$em = \Zend_Registry::get('em'); 
$qb_1 = $em->createQueryBuilder(); 
$q_1 = $qb_1->select('wsh') 
    ->from('\Entities\wishes', 'wsh') 
    ->where('wsh.created_at >= :today_startdatetime') 
    ->andWhere('wsh.created_at <= :today_enddatetime'); 


$q_1->setParameter('today_startdatetime', $today_startdatetime); 
$q_1->setParameter('today_enddatetime', $today_enddatetime); 
$result= $q_1->getQuery()->getResult(); 
+0

यहां सबसे अच्छा जवाब है! – Ian

+0

यह एक और अधिक सीधा जवाब है। एसएडी कि ओआरएम इसके लिए विशिष्ट कार्य प्रदान नहीं करता है – jrran90

10

यह भी में निर्मित समारोह DATE_DIFF(date1, date2) जो रिटर्न उपयोग करना संभव है दिनों में अंतर चेक docs

$result = $this->createQueryBuilder('l') 
    ->where('DATE_DIFF(l.startDate, CURRENT_DATE()) = 0') 
2

एक आसान समाधान दिनांक फ़ॉर्मेट करने के लिए किया जाएगा तदनुसार

public function getWithStartingPremium(\DateTime $datetime) 
{ 
    $qb = $this->createQueryBuilder('c'); 

    return $qb 
     ->innerJoin('c.collegePremium', 'cp') 
     ->where($qb->expr()->eq('cp.start', ':date')) 
     ->setParameters(array(
      'date' => $datetime->format('Y-m-d'), 
     )) 
     ->getQuery() 
     ->getResult(); 
} 
संबंधित मुद्दे