2011-12-23 115 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") } });