2012-05-21 63 views
11

我想获得今天由QueryBuilder从Doctrine2创建的项目。我想比较createdAt(日期时间)字段和今天的参数(日期)。在一个查询中可以这样做吗?如何将Doctrine2的datetime字段与日期进行比较?

$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 

回答

19

一个想法是从日期提取比较日期为DateTime。然后

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

月日,年你从

例如取出DoctrineExtensions

DoctrineExtensions

这对我的作品。你只需要在文件:day.php,month.php和year.php .....

你得到的月如:

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

复制day.php,month.php和年份。 PHP向您的绑定XY \ TestBundle \ DQL 注册新的功能,在应用程序\ config.yml与

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

它工作,但它有点脏。你知道QueryBuilder的DATE()函数是否与这个包一起提供? – gperriard

+1

@jooyce没有。 [Here](https://github.com/simukti/DoctrineExtensions/tree/master/lib/DoctrineExtensions/Query/Mysql)是可用的扩展名列表 –

+0

这仍然适用于MySQL和Oracle吗? –

5

你必须添加到您的查询的QueryBuilder的today参数。年,月,日:

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

随着QueryBuilder的,您可以用格式'Y-m-d'

+0

我试着用TODAY- $>格式(“YM-d”)为参数的管理,但我没有结果。我只需要为'createdAt'字段获取'Y-m-d'。 – gperriard

+0

你试过直接传递'DateTime'对象作为参数吗? – Florian

+0

是的,但这不是一样的价值(当我比较它们时,我得到了错误),这不完全是我想要的。我会获得在同一天创建的项目,但任何时候都可以。 i。createdAt = 2012-05-21 13:18:27 $ today = 2012-05-21 14:23:34 – gperriard

13

这是罕见的,这样一个成熟的ORM不提供DATE功能。但是,要获得一个约会了日期时间字段,你可以应用SUBSTRING功能是这样的:

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

希望它能帮助!

+0

Tks for you回答!帮助很多! –

+0

种类的哈克修复,直到DATE功能支持教条!谢谢,, –

11

有比为日期添加doctrine扩展名更好的选项。

首先,你需要获得启动日期时间和结束日期时间:

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

现在,在查询中使用它们:

$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

这里最好的答案! – Ian

+0

这是一个更直接的答案。 SAD ORM没有为此提供特定的功能 – jrran90

10

也可以使用内置函数DATE_DIFF(date1, date2)返回天数不同。检查docs

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

一个简单的解决办法是格式化的日期时间相应

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(); 
} 
相关问题