这个问题我需要一些帮助。我正在使用Symfony2 + mongodb +学说创建一个应用程序。我只是想使用Doctrine ODM来查询在过去5分钟内登录的所有用户。我有一个用户集合,其日期字段名为date_last_login。
所以我试着像这样使用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") } });
我做错了什么?谢谢你的帮助!
在date_last_login
大于5 minutes
时创建查询生成器
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将您的日期时间格式转换为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
对象:
$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();
所有三种方法将创建如下查询:
db.User.find({ "date_last_login": { "$gte": new ISODate("2014-03-15T19:35:08+02:00") } });
这可能是由于这个PHP错误,该错误已在5.3.3中修复:
https://bugs.php.net/bug.php?id=50916