Php Doctrine Mongodb ODM和日期时间查询
在这个问题上我需要一些帮助。我正在使用Symfony2+mongodb+原则创建一个应用程序。 我只想使用Doctrine ODM查询过去5分钟内登录的所有用户。我有一个用户集合,其中有一个名为date\u last\u login的日期字段 因此,我尝试这样使用querybuilder:Php Doctrine Mongodb ODM和日期时间查询,php,mongodb,symfony,doctrine-orm,doctrine-odm,Php,Mongodb,Symfony,Doctrine Orm,Doctrine Odm,在这个问题上我需要一些帮助。我正在使用Symfony2+mongodb+原则创建一个应用程序。 我只想使用Doctrine ODM查询过去5分钟内登录的所有用户。我有一个用户集合,其中有一个名为date\u last\u login的日期字段 因此,我尝试这样使用querybuilder: <?php // Creating a DateTime object and susbtract 5 min from now // local time is 15:40:05, timezone:
<?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();
看起来不错,只是日期提前了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") } });
这可能是由于5.3.3中修复的PHP错误造成的:
要创建查询生成器,以便在日期\u上次登录时获取数据
超过5分钟
有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
对象并使用strotime将您的datetime格式转换为时间戳
:
$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) 只有在原则2 ODM
的情况下,您才可以使用'r DateTime格式创建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();
所有3种方式都将创建此查询:
db.User.find({ "date_last_login": { "$gte": new ISODate("2014-03-15T19:35:08+02:00") } });
非常感谢,你说得对,我的PHP版本在5.3.3之前!顺便说一句,由于这个bug只影响DateTime对象的子方法,一个简单的解决方法是直接创建正确的DateTime对象,如下所示:$\u DateTime=new\DateTime('5分钟前');
db.User.find({ "date_last_login": { "$gte": new ISODate("2014-03-15T19:35:08+02:00") } });