私は修正されていないこの最小限のエラーに夢中になります。 2日間のエントリを選択したいのですが、以下の例はすべての失敗を示しています。
オプション1
$qb->where('e.fecha > ' . $monday->format('Y-m-d'));
$qb->andWhere('e.fecha < ' . $sunday->format('Y-m-d'));
結果(0エントリ):
SELECT r0_.id_reservacion AS id_reservacion0, r0_.fecha AS fecha1, r0_.cliente AS cliente2
FROM reservacion r0_
WHERE (r0_.fecha > 2012 - 07 - 16) AND (r0_.fecha < 2012 - 07 - 22)
opt 2
$qb->add('where', 'e.fecha between 2012-01-01 and 2012-10-10');
結果(0エントリ):
SELECT r0_.id_reservacion AS id_reservacion0, r0_.fecha AS fecha1, r0_.cliente AS cliente2
FROM reservacion r0_ WHERE r0_.fecha
BETWEEN 2012 - 01 - 01 AND 2012 - 10 - 10
これは現在のエントリを持つ私のテーブルです:
id fecha cliente
1 2012-07-16 00:00:00 2
2 2012-07-16 13:00:00 4
3 2012-07-22 23:00:00 4
疑念を避けるためにSQLを評価するために、私はこのクエリを実行しました:
$qb->where('e.fecha > ' . $sunday->format('Y-m-d'));
結果(3エントリ):
SELECT r0_.id_reservacion AS id_reservacion0, r0_.fecha AS fecha1, r0_.cliente AS cliente2
だから、SQLは問題ではないように見えます。 FROMの予約r0_ WHERE r0_.fecha> 2012-07
どちらでもできます…
$qb->where('e.fecha BETWEEN :monday AND :sunday')
->setParameter('monday', $monday->format('Y-m-d'))
->setParameter('sunday', $sunday->format('Y-m-d'));
または…
$qb->where('e.fecha > :monday')
->andWhere('e.fecha < :sunday')
->setParameter('monday', $monday->format('Y-m-d'))
->setParameter('sunday', $sunday->format('Y-m-d'));
正しい方法は、クエリビルダー式を使用することだと思います。
$now = new DateTime();
$thirtyDaysAgo = $now->sub(new \DateInterval("P30D"));
$qb->select('e')
->from('Entity','e')
->add('where', $qb->expr()->between(
'e.datefield',
':from',
':to'
)
)
->setParameters(array('from' => $thirtyDaysAgo, 'to' => $now));
http://docs.doctrine-project.org/en/latest/reference/query-builder.html#the-expr-class
編集:この方法が他のどの答えよりも優れている点は、データベースソフトウェアに依存しないことです-この種のことを処理するための抽象化レイヤーがあるため、Doctrineに日付型を処理させる必要があります。
'Y-m-d'の形式で文字列変数を追加するなどの操作を行うと、たとえばMySQL以外のデータベースプラットフォームに移動したときに壊れます。
編集:より良い解決策については他の回答を参照してください
私が提供した最初の初心者のアプローチは(opt1)でした:
$qb->where("e.fecha > '" . $monday->format('Y-m-d') . "'");
$qb->andWhere("e.fecha < '" . $sunday->format('Y-m-d') . "'");
そして(opt2):
$qb->add('where', "e.fecha between '2012-01-01' and '2012-10-10'");
それは迅速かつ簡単であり、元のポスターはすぐに行きました。
したがって、受け入れられた答え。
コメントによると、それは間違った答えですが、間違いを犯すのは簡単ですので、ここでは「してはいけないこと」として残しています。
パラメーターで日付$ jourをフォーマットする方法を見てください。 expr()-> likeまたはexpr()-> lteのどちらを使用するかによります
$qb
->select('e')
->from('LdbPlanningBundle:EventEntity', 'e')
->where(
$qb->expr()->andX(
$qb->expr()->orX(
$qb->expr()->like('e.start', ':jour1'),
$qb->expr()->like('e.end', ':jour1'),
$qb->expr()->andX(
$qb->expr()->lte('e.start', ':jour2'),
$qb->expr()->gte('e.end', ':jour2')
)
),
$qb->expr()->eq('e.user', ':user')
)
)
->andWhere('e.user = :user ')
->setParameter('user', $user)
->setParameter('jour1', '%'.$jour->format('Y-m-d').'%')
->setParameter('jour2', $jour->format('Y-m-d'))
->getQuery()
->getArrayResult()
;