DQL

2012-11-07 18 views
13

ile WHERE deyimindeki bir TARİH() işlevini kullanın Garip bir hata alıyorum:DQL

SELECT u FROM User u LEFT JOIN u.schedule s WHERE DATE(s.timestamp) = DATE(NOW()) 
istisna mesajı ile Doktrin tarafından atılır

:

Expected known function, got 'DATE' 

Sorun, this bug'a benzer gibi görünüyor, ancak bu, GROUP BY deyiminde DATE() işlevini ele alıyor ve Doctrine 2.2 için hata kapatıldı. Şu anda, istisnai doktrin 2.4-DEV ile olsun.

Sorgu, bugün için planlanan tüm kullanıcıları seçmek içindir. Bu DQL'yi oluşturabilmem için herhangi bir yolu var mı? PhpMyAdmin'de SQL sürümünü test ettim ve orada sorgu bir hata oluşturmuyor. Ne yanlış olabilir?

+1

Doctrine2 DQL'in DATE() veya NOW() işlevi yok: http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-functions . Ama gerçekten iki zaman damgasını eşitlikle karşılaştırmak istiyor musun? – memoryleak

+0

Randevu almak için hastaları planladım (tarih + saat) ve bugün tüm hastaları listelemek istiyorum. Bunu yapmanın çirkin bir yolu vardır: ifadeyi "bugün" için bir php 'DateTime 'nesnesiyle hazırlayın. Vetetime alanını "tarih" ve "zaman" bölümüne ayırın. İlk çirkin parçanın üstesinden gelebilirim, fakat ikincisi sadece bir db katmanı problemi yüzünden db'nize batıyor. İşte bu yüzden bu işe yarayacak bir çözüm olmasını ümit ettim :) Program_day FROM olarak bir SELECT CAST (DATE olarak DATE) denedim ... WHERE program_day =: bugün 'ancak benzer bir hata döndürdü ... –

cevap

31

Bir custom function kullanarak istediğini elde edebilirsiniz: Sonra kodunda bu işlevi kayıt

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

Ve DQL sorgu çalışacak!

+0

WIll Deneyin, teşekkürler! Bu bana zamanlanmış zaman damgayı ayrılmış bir günde ve zaman parçasında böldüğüm birçok baş ağrısından kurtarabilir –

+0

Benim için çalıştı! T4All! –

+7

Symfony2 uygulamasında yeni DQL işlevinin nasıl kaydedileceği aşağıda açıklanmıştır: http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html – Quentin

İlgili konular