Doctrine2 の datetime フィールドを日付と比較する方法は?

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

$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
ソリューション

というのは、日付から、年、月、日を抽出することです。そして

$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);

から DoctrineExtensions を取り出して、MONTH DAY, YEAR とします。

例えば

DoctrineExtensions のようになります。

これでうまくいきました。必要なファイルは day.php, month.php, year.php だけです......。

あなたは、例えば、月を取得します。

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

day.php, month.php, year.php をバンドルにコピーする XyTestBundle

解説 (4)

このような成熟した ORM で DATE 関数が提供されていないことは稀です。しかし、datetime フィールドから日付を取り出すには、次のように SUBSTRING 関数を適用します。

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

お役に立てれば幸いです。

解説 (2)

クエリビルダーに today パラメータを追加する必要があります。

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

QueryBuilder を使うと、'Y-m-d' というフォーマットで日付を DateTime に比較することができます。

解説 (3)