2013-03-19 37 views
2

在表列(a.paymentDate)中插入日期格式爲Y-m-d H:m:i格式。我想查詢特定日期的所有條目。爲此,我必須將日期格式從Y-m-d H:m:i更改爲Y-m-d。我的查詢是在下面給出的。在symfony2中更改原則查詢中的日期格式

namespace Regal\SmsBundle\Repository; 

use Doctrine\ORM\EntityRepository; 


/** 
* DailyTransactionRepository 
* 
* This class was generated by the Doctrine ORM. Add your own custom 
* repository methods below. 
*/ 
class DailyTransactionRepository extends EntityRepository 
{ 
    public function getDailyPayment($studentId,$paymentDate) 
    { 
     $paymentDate= new \DateTime('2013-03-11'); 
    $query = $this->getEntityManager()->createQuery(" 
     SELECT a.id, a.amont, a.paymentDescrip, a.paymentType, a.paymentDate 
     FROM RegalSmsBundle:DailyTransaction a 
     WHERE DATE(a.paymentDate) = :paymentDate AND a.students = :studentId 
    ") 
    ->setParameter('studentId', $studentId) 
    ->setParameter('paymentDate', $paymentDate->format('Y-m-d')) 
; 

return $query->getResult(); 
    } 
} 

回答

3

試試這個,

$query = $this->getEntityManager()->createQuery(" 
     SELECT a.id, a.amont, a.paymentDescrip, a.paymentType, a.paymentDate 
     FROM RegalSmsBundle:DailyTransaction a 
     WHERE DATE(a.paymentDate) = :paymentDate AND a.students = :studentId 
    ") 
; 

$compareTo = new \DateTime('2013-03-11'); 
$query->setParameters(array(
     'studentId' => $studentId, 
     'PaymentData' => $compareTo->format('Y-m-d')), 
)); 

return $query->getResult(); 

更新,

好像日期()無法識別。所以,讓我的代碼片段共享工作。您應該添加一個Custom DQL FunctionRegister the extension讓您的實體經理知道它。

看看the documentation,它很好解釋。

此外,

我認爲這是可以使用DATE_DIFF(date1, date2)爲comparaison - 它可以讓你在天,做適合你的需求的差異。

+0

您正處於正確的軌道上,但由於Doctrine DQL查詢處理器無法識別DATE,因此無法使用。 – Cerad 2013-03-19 16:26:22

+0

嗨艾哈邁德 - 它顯示以下錯誤'錯誤:預期的已知功能,得到'日期'' – Tushar 2013-03-19 16:36:14

+0

@Cerad你是對的。 [似乎沒有被支持](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#dql-functions)。 @ Tushar,看看Cerad的延伸。 – 2013-03-19 16:41:29

1

爲了讓Ahmed的工作回覆正常(假設您使用的是Mysql),您需要添加一個原則擴展。

namespace Cerad\Bundle\GameBundle\Doctrine\DQL; 

use Doctrine\ORM\Query\Lexer; 
use Doctrine\ORM\Query\AST\Functions\FunctionNode; 

/** 
* "DATE" "(" SimpleArithmeticExpression ")". Modified from DoctrineExtensions\Query\Mysql\Year 
* 
* @category DoctrineExtensions 
* @package DoctrineExtensions\Query\Mysql 
* @author Rafael Kassner <[email protected]> 
* @author Sarjono Mukti Aji <[email protected]> 
* @license MIT License 
*/ 
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); 
    } 
} 

然後查看食譜,看看如何通過在實體管理器配置文件中添加dql部分來激活擴展。

+0

抱歉,我是新的symfony2。我必須在哪裏使用該擴展?我的整個代碼都在下面給出。 – Tushar 2013-03-19 16:44:04

1

使用查詢構建器中低技術的方法可能是:

class DailyTransactionRepository extends EntityRepository 
{ 
    public function getDailyPayment($studentId,$paymentDate) 
    { 
     $paymentDate= new \DateTime('2013-03-11');   
     $nextDate = paymentDate; 
     $nextDate->modify('+1 day'); 

     $qb = $this->getEntityManager()->createQueryBuilder('a'); 
     $qb->andWhere("a.paymentDate > '$paymentDate'"); 
     $qb->andWhere("a.paymentDate < '$nextDate'"); 

    return $qb->getQuery()->getResult(); 
    } 
} 

你並不真的需要選擇字段明確,除非你絕對必須有一個部分對象。所有的字段將由實體getter和setter提供。