2014-09-23 82 views
7

我需要得到DATE(a.when)與字符串2014-09-30匹配的所有行。在Doctrine Querybuilder中使用`DATE()`

$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 - 由日期時間字段的日期部分篩選結果](http://stackoverflow.com/questions/10824383/doctrine-2 -filter-by-a-datetime-fields-date-part) – andy 2014-09-23 15:56:43

+0

@andy不是重複的。我使用** queryBuilder **,使用'createQuery'和'queryBuilder'的錯誤消息是相同的:'錯誤:期望的已知函數,得到'DATE''。 – DanFromGermany 2014-09-23 16:02:52

+1

錯誤是相同的,因爲在DQL中沒有'DATE()'。如果您使用鏈接副本中的WHERE子句,則您的方法也應該可以正常工作。 – andy 2014-09-23 16:05:22

回答

7

這實際上是一個非常普遍的問題。 事實證明,並非所有的sql數據庫都支持DATE函數,所以負責Doctrine的好人決定不支持nativelly。

他們所做的一種願望,因爲它會爲一羣人節省相當的努力。

所以這個相當神奇的類添加到您的項目:

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學說截面線材起來

還有其他包與更多的SQL功能。奇怪的是,幾年前我第一次看,他們都沒有定義日期。所以我只是做了我自己的。

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

更新01

我沒有仔細檢查標籤,並認爲這是一個Symfony的2應用程序。 Date類保持不變。你通過獲取doctrine配置對象來連接它。

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

查看詳細信息的Doctrine鏈接。

+0

我爲你付出了努力,不幸的是我不能像教條一樣改變我們的核心庫。我現在採用非DQL方式,直到找到更好的方式。 – DanFromGermany 2014-09-23 16:04:43

+0

你並沒有改變核心庫。你只是添加一個自定義函數。教義內沒有任何內容正在改變。 – Cerad 2014-09-23 16:06:28

+0

我無法將它「連線」。我沒有這個配置文件。我現在嘗試用'YEAR()','DAY()'和'MONTH()',因爲他們的類文件已經存在,但是錯誤相應地相同.. – DanFromGermany 2014-09-23 16:24:45

7

感謝Andy,現在使用這樣的:

$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')); 
相關問題