2012-05-21 7 views
11

Doctrine2'den bir QueryBuilder tarafından bugün oluşturulmuş öğeleri almak istiyorum. CreatedAt (Datetime) alanını bugün parametresiyle (Tarih) karşılaştırmak istiyorum. Bunu bir sorguda yapmak mümkün mü?Tarih ile doctrine2'den datetime alanını nasıl karşılaştırılır?

$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 

cevap

19

bir fikri tarihinden itibaren çıkarmaktır formatı ile DateTime için tarihleri ​​karşılaştırabilirsiniz. Sonra

$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); 

AY GÜN ve YIL sen

örn gelen DoctrineExtensions çıkarmak

DoctrineExtensions

Bu benim için çalışıyor. Yalnızca dosyaları gerekir: day.php, month.php ve year.php .....

Sen ay örneğin olsun:

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

Kopya day.php, month.php ve yılı. Paketinizdeki 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

Çalışıyor, ama biraz kirli. QueryBuilder için DATE() işlevinin bu paketle birlikte sağlandığını biliyor musunuz? – gperriard

+1

@jooyce yok. [Burada] (https://github.com/simukti/DoctrineExtensions/tree/master/lib/DoctrineExtensions/Query/Mysql) mevcut uzantıların listesi –

+0

Bu hala sadece MySQL ve Oracle için çalışıyor mu? –

5

Sen today parametre QueryBuilder sorgunuzla eklemek zorunda. yıl, ay ve gün:

querybuilder ile
$today = new \DateTime(); 
$qb->setParameter('today', $today->format('Y-m-d')); 

, sen 'Y-m-d'

+0

Ben $ bugün-> parametre olarak formatında ('Ym-d') ile yönetmek çalıştım ama hiçbir var sonuç. 'CreatedAt' alanı için sadece 'Y-m-d' almam gerekiyor. – gperriard

+0

Bir "DateTime" nesnesini parametre olarak doğrudan iletmeyi denediniz mi? – Florian

+0

Evet, ama aynı değer değil (onları karşılaştırdığımda yanlış anladım) ve tam olarak ne yaptığımı değil. Aynı günde oluşturulmuş eşyaları, ancak istediğim zaman alacağım. i.createdAt = 2012-05-21 13:18:27 $ bugün = 2012-05-21 14:23:34 – gperriard

13

böyle olgun bir ORM DATE fonksiyonunu sağlamadığını nadir olan app \ config.yml yeni işlevler kaydedin. Ancak, datetime alanın dışında bir tarihi almak için, aşağıdaki gibi SUBSTRING işlevi uygulayabilirsiniz:

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

yardımcı olur Umut!

+0

Tk sizin için cevapladı! –

+0

DATE işlevi Doctrine tarafından destekleninceye kadar hacky düzeltme türü! teşekkürler ,, –

11

Tarih için doktrin uzantısını eklemekten daha iyi bir seçenek var.

$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")); 

Şimdi sorguda bunları kullanmak:

Önce start-datetime ve son datetime almak gerekir

$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

burada en iyi cevap! – Ian

+0

Bu daha düz bir yanıttır. ORP, bunun için belirli bir işlev sağlamadı – jrran90

10

O döndüren yerleşik işlev DATE_DIFF(date1, date2) kullanmak da mümkündür günlerde fark. docs

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

edin kolay bir çözüm datetime biçimlendirmek olacaktır buna göre

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(); 
}