2011-12-23 15 views
4

私はこの問題についていくつかの助けをすることができます。私はSymfony2 + mongodb + doctrineを使ってアプリケーションを作成しています。 Doctrine ODMを使用して、過去5分間にログインしたすべてのユーザーにクエリを実行します。私はdate_last_loginと呼ばれる日付フィールドを持つUserコレクションを持っています。Doctrine Mongodb ODMとDateTimeクエリ

だから私はそのようなquerybuilder使用しよう:私はSymfony2のプロファイラを使用して組み立てたクエリを見たとき

<?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(); 

を、ここで私が得たものである:

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

それはそれ以外罰金です日付は5分ではなく10分早くなりますか?私はそれを得ていない。私のPHP DateTimeオブジェクトをダンプする場合、日付は正しい:2011-12-23 15:35:05(5分前の15:40)。

だから私は、任意の分をsubstractingせずに同じクエリを組み立てることを試みた。この時間は、すべてが正常である:私は間違っ

<?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より前です!ちなみに、このバグはDateTimeオブジェクトのサブメソッドにのみ影響するため、簡単な回避策は、そのような正しいDateTimeオブジェクトを直接作成することです:$ _dateTime = new \ DateTime( '5 minutes ago'); – JuCachalot

7

がGETデータのクエリビルダを作成する際に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オブジェクトを作成し、timestampにyou`r日時形式を変換するためのstrtotimeを使用します。

$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には、あなただけのyou`r日時書式でDateTimeオブジェクトを作成することができます

db.User.find({ "date_last_login": { "$gte": new ISODate("2014-03-15T19:35:08+02:00") } }); 
:クエリこれを作成します
$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つの方法

関連する問題