我会因为这个没有得到修复的最小错误而发疯。我想在两天内选择条目,下面的例子显示了我所有的失败:
选择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)
选择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
编辑1
为了评估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不是问题所在。自预留r0_其中r0_focha>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 DateTimeImmutable();
$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级
编辑:与这里的任何其他答案相比,这种方法的优势在于它独立于数据库软件——你应该让Doctrine处理日期类型,因为它有一个处理这类事情的抽象层。
例如,如果你添加一个形式为"Y-m-d"的字符串变量,当它转到MySQL以外的数据库平台时,它就会中断。
---另一个例子:
此示例通过使用大于和小于方法生成介于条件之间的条件。
if ($updateDateTime instanceof DateTime) {
$qb->andWhere(
$qb->expr()->gte('c.updated', ':updateDateTimeStart'),
$qb->expr()->lt('c.updated', ':updateDateTimeEnd'),
);
$updateDateTimeImmutable = DateTimeImmutable::createFromMutable($updateDateTime);
$start = $updateDateTimeImmutable->setTime(0,0,0, 0);
$end = $start->modify('+1 day');
$qb->setParameter('updateDateTimeStart', $start, Types::DATE_IMMUTABLE);
$qb->setParameter('updateDateTimeEnd', $end, Types::DATE_IMMUTABLE);
}
编辑:查看其他答案以获得更好的解决方案
我最初提供的新手方法是(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()
;