2014-09-23 25 views
7

I DATE(a.when) dize 2014-09-30 maçları tüm satırları almak gerekir.kullanma `TARİH()` Doktrin querybuilder

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

a.when tam DATETIME olduğu; :date sadece string (içinde DATE biçimi).

aşağıdaki ve varyasyonlar işe yaramadı:

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

Error: Expected known function, got 'DATE' 

doğru kullanımı burada ne var?

+0

olası yinelenen [Doktrini 2 - Bir datetime alanın tarih bölümü tarafından Filtre sonuçlarına] (http://stackoverflow.com/questions/10824383/doctrine-2 -filter-sonuç-bir-datetime-alanları-tarih-bölüm) – andy

+0

@andy değil bir yinelenen. ** queryBuilder ** kullanıyorum ve 'createQuery 've' queryBuilder 'kullanarak hata mesajı aynıdır: Hata: Bilinen fonksiyon beklenen,' DATE 'aldı. – DanFromGermany

+1

erro aynıdır, çünkü DQL'de DATE() 'yoktur. Bağlantılı yinelemeden WHERE yan tümcesini kullanırsanız, yaklaşımınız da işe yaramalıdır. – andy

cevap

7

Bu aslında çok yaygın bir sorudur. O değil tüm sql veritabanları bir TARİH fonksiyonunu desteklemesi çıkıyor, bu nedenle Doktrin sorumlu iyi insanlar nativelly bunu desteklemeye karar verdi. insanların bir demet çaba adil bir miktar kaydedilmiş olurdu çünkü dileğin

Tür yaptılar.

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

Sonra uygulamanızı/config.yml doktrini bölümünde bu kadar Tel:

Yani projenize bu oldukça büyülü sınıf eklemek

daha sql fonksiyonları ile orada diğer grup yok. Garibi, birkaç yıl önce ilk kez baktığımda, hiçbirinin Tarih tanımlaması yoktu. Bu yüzden kendiminkini yaptım.

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

Güncelleme 01

dikkatle etiketleri kontrol ve bu Symfony'nin 2 uygulama olduğunu farz vermedi. Tarih sınıfı aynı kalır. Doktrin konfigürasyon nesnesini alarak bağlarsınız.

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

Ayrıntılar için Doktrin bağlantısını kontrol edin. Andy için

+0

Size çabalarınız için bir vesile veriyorum maalesef Doctrine gibi çekirdek kütüphanelerimizi değiştiremiyorum. Daha iyi bir yol bulana kadar DQL olmayan bir yolla gidiyorum. – DanFromGermany

+0

Çekirdek kitaplığını değiştirmiyorsunuz. Sadece özel bir işlev ekliyorsunuz. Doktrinin içindeki hiçbir şey değiştirilmiyor. – Cerad

+0

"Kablolu" elde edemiyorum. Bu yapılandırma dosyasına sahip değilim.Şimdi sınıf dosyaları zaten vardı çünkü hata YEAR(), 'DAY()' ve 'MONTH()' ile denedim ama hata aynıdır .. – DanFromGermany

7

sayesinde şimdi bu kullanarak:

$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')); 
ait
İlgili konular