2012-05-21 5 views
11

Doctrine2のQueryBuilderで今日作成されたアイテムを取得したいと思います。 createdAt(Datetime)フィールドとtodayパラメータ(Date)を比較したいと思います。 1つのクエリでこれを行うことは可能ですか?Doctrine2のdatetimeフィールドを日付と比較するにはどうすればいいですか?

$qb = $this->createQueryBuilder('i'); 
$qb->innerJoin('i.type', 'it'); 
$qb->andWhere('it.name = :type'); 
$qb->andWhere('i.createdAt < :today'); 
// i.createdAt == datetime and :today parameter is a date 

答えて

19

1アイデアは日から抽出することである形式でのDateTimeに日付を比較することができます。そして

$qb->select('p') 
    ->where('YEAR(p.postDate) = :year') 
    ->andWhere('MONTH(p.postDate) = :month') 
    ->andWhere('DAY(p.postDate) = :day'); 

$qb->setParameter('year', $year) 
    ->setParameter('month', $month) 
    ->setParameter('day', $day); 

MONTHのDAY、およびYEARあなたは

例えばからDoctrineExtensionsを取ります

DoctrineExtensions

これは私のために動作します。

$datetime = new \DateTime("now"); 
    $month = $datetime->format('m'); 
    echo $month; 

コピーday.php、month.php年:あなたは月の例を取得

..... day.php、month.phpとyear.php:あなただけのファイルが必要です。あなたのバンドルXY \ TestBundle \ DQL にPHPが

doctrine: 


orm: 
    auto_generate_proxy_classes: %kernel.debug% 
    entity_managers: 
     default: 
      auto_mapping: true 
      dql: 
       datetime_functions: 
        month: Xy\TestBundle\Dql\Month 
        year: Xy\TestBundle\Dql\Year 
        day: Xy\TestBundle\Dql\Day 
+1

これは動作しますが、少し汚れています。 QueryBuilderのDATE()関数がこのバンドルで提供されているかどうか知っていますか? – gperriard

+1

@jooyceありません。 [Here](https://github.com/simukti/DoctrineExtensions/tree/master/lib/DoctrineExtensions/Query/Mysql)は利用可能な拡張機能のリストです –

+0

これはまだMySQLとOracleのためにのみ有効ですか? –

5

QueryBuilderにtodayパラメータを追加する必要があります。年、月、日:

QueryBuilderで
$today = new \DateTime(); 
$qb->setParameter('today', $today->format('Y-m-d')); 

、あなたは'Y-m-d'

+0

私は$ TODAY->パラメータとしてフォーマット(「YM-D」)で管理しようとしませんが、私は何を持っています結果。私は 'createdAt'フィールドの 'Y-m-d'だけを取得する必要があります。 – gperriard

+0

'DateTime'オブジェクトをパラメータとして直接渡そうとしましたか? – Florian

+0

はい、それは同じ値ではありません(私はそれらを比較すると私は偽を持っています)。私は、同じ日に作成されたアイテムをいつでも得ることができます。 i。createdAt = 2012-05-21 13:18:27 $ today = 2012-05-21 14:23:34 – gperriard

13

それは、このような成熟したORMはDATE機能を提供していないことはまれだとアプリ\ config.ymlに新機能を登録します。ただし、日時フィールドの外に日付を取得するには、このようSUBSTRING機能を適用することができます。

SELECT SUBSTRING(i.dateTimeField,1,10) FROM tableName i 

はそれが役に立てば幸い!

+0

あなたのためにTksが答えました! –

+0

DATE関数がDoctrineによってサポートされるまで、ハックフィックスの種類!ありがとう、 –

11

日付にdoctrine拡張子を追加するよりも良い選択肢があります。

$today_startdatetime = \DateTime::createFromFormat("Y-m-d H:i:s", date("Y-m-d 00:00:00")); 
$today_enddatetime = \DateTime::createFromFormat("Y-m-d H:i:s", date("Y-m-d 23:59:59")); 

今クエリでそれらを使用します:

まずあなたは開始日時と終了日時を取得する必要があり

$em = \Zend_Registry::get('em'); 
$qb_1 = $em->createQueryBuilder(); 
$q_1 = $qb_1->select('wsh') 
    ->from('\Entities\wishes', 'wsh') 
    ->where('wsh.created_at >= :today_startdatetime') 
    ->andWhere('wsh.created_at <= :today_enddatetime'); 


$q_1->setParameter('today_startdatetime', $today_startdatetime); 
$q_1->setParameter('today_enddatetime', $today_enddatetime); 
$result= $q_1->getQuery()->getResult(); 
+0

ここで最善の答え! – Ian

+0

これはより簡単な答えです。 ORMがこれに特定の機能を提供していないことを悲しい – jrran90

10

返す組み込み関数DATE_DIFF(date1, date2)を使用することも可能です日数の違い。 docs

$result = $this->createQueryBuilder('l') 
    ->where('DATE_DIFF(l.startDate, CURRENT_DATE()) = 0') 
2

調べる簡単な解決策は、日時をフォーマットすることであろうと、それに応じて

public function getWithStartingPremium(\DateTime $datetime) 
{ 
    $qb = $this->createQueryBuilder('c'); 

    return $qb 
     ->innerJoin('c.collegePremium', 'cp') 
     ->where($qb->expr()->eq('cp.start', ':date')) 
     ->setParameters(array(
      'date' => $datetime->format('Y-m-d'), 
     )) 
     ->getQuery() 
     ->getResult(); 
} 
関連する問題