2011-12-23 113 views
4

我可以在这个问题上使用一些帮助。我正在使用Symfony2 + mongodb + doctrine创建一个应用程序。 我只想使用Doctrine ODM来查询最近5分钟内已经登录的所有用户。我有一个名为date_last_login的日期字段的用户集合。Doctrine Mongodb ODM和DateTime查询

所以我尝试使用这样的QueryBuilder的:

<?php 
// Creating a DateTime object and susbtract 5 min from now 
// local time is 15:40:05, timezone: 'Europe/Paris' 
$_dateTime = new \DateTime(); 
$_interval5Min = new \DateInterval('PT5M'); 
$_dateTime->sub($_interval5Min); 

$query = $this->createQueryBuilder('User') 
       ->field('date_last_login')->gte($_dateTime) 
       ->getQuery(); 
       ->execute(); 

当我使用Symfony2的探查看着组装查询,这里是我的了:

db.User.find({ "date_last_login": { "$gte": new Date("Fri, 23 Dec 2011 15:30:05 +0100") } }); 

看来,除了罚款日期提前10分钟而不是5分钟?我只是不明白。如果我转储我的php DateTime对象,日期是正确的:2011-12-23 15:35:05(15:40前五分钟)。

于是,我就没有装配任何从其减去分钟,这段时间相同的查询,一切都很好:

<?php 
// local time is 15:50:00 
$query = $this->createQueryBuilder('User') 
      ->field('date_last_login')->gte(new \DateTime()) 
      ->getQuery(); 
      ->execute(); 

// query is ok: 
db.User.find({ "date_last_login": { "$gte": new Date("Fri, 23 Dec 2011 15:50:00 +0100") } }); 

我在做什么错? 谢谢你的帮助!

回答

1

这可能是由于其固定在5.3.3这个PHP错误:

https://bugs.php.net/bug.php?id=50916

+1

非常感谢你,你说得对,我的PHP版本早于5.3.3!顺便说一下,因为这个bug只影响DateTime对象的子方法,所以一个简单的解决方法就是直接创建如下所示的正确的DateTime对象:$ _dateTime = new \ DateTime('5 minutes ago'); – JuCachalot 2011-12-24 08:12:48

7

要为获取数据创建查询生成器时date_last_login极大比5 minutes有3种方式

1)用您的日期时间格式创建DateTime对象,并从DateTime获得timestamp对象,然后创建MongoDate对象:

$timeBefore5MinutesAgo = new \DateTime(date('Y-m-d H:i:s',\time() - 5 * 60)); 
$mongoDateBefore5MinutesAgo = new \MongoDate($currentDateWithTime->getTimestamp()); 

$query = $this->createQueryBuilder('User') 
    ->field('date_last_login')->gte($mongoDateBefore5MinutesAgo) 
    ->getQuery(); 
    ->execute(); 

2)创建MongoDate对象,并使用的strtotime到you`r日期时间格式转换为timestamp

$mongoDateBefore5MinutesAgo = new \MongoDate(strtotime(date('Y-m-d H:i:s',\time() - 5 * 60))); 

$query = $this->createQueryBuilder('User') 
    ->field('date_last_login')->gte($mongoDateBefore5MinutesAgo) 
    ->getQuery(); 
    ->execute(); 

3)只有在情况下Doctrine 2 ODM,你可以创建DateTime对象与you`r日期时间格式:

$timeBefore5MinutesAgo = new \DateTime(date('Y-m-d H:i:s',\time() - 5 * 60)); 

$query = $this->createQueryBuilder('User') 
       ->field('date_last_login')->gte($timeBefore5MinutesAgo) 
       ->getQuery(); 
       ->execute(); 

所有3种方式将创建查询此:

db.User.find({ "date_last_login": { "$gte": new ISODate("2014-03-15T19:35:08+02:00") } }); 
相关问题