Doctrine Mongodb ODM和DateTime查询
问题描述:
我可以在这个问题上使用一些帮助。我正在使用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") } });
我在做什么错? 谢谢你的帮助!
答
要为获取数据创建查询生成器时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") } });
非常感谢你,你说得对,我的PHP版本早于5.3.3!顺便说一下,因为这个bug只影响DateTime对象的子方法,所以一个简单的解决方法就是直接创建如下所示的正确的DateTime对象:$ _dateTime = new \ DateTime('5 minutes ago'); – JuCachalot 2011-12-24 08:12:48