在学说2中的日期之间选择条目

时间:2012-07-19 02:39:29

标签: php date doctrine-orm between query-builder

我会因为这个我没有得到解决的最小错误而疯狂。我想在两天之间选择条目,下面的例子说明我所有的失败:

选择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_.fecha&gt; 2012 - 07

4 个答案:

答案 0 :(得分:128)

你可以做任何一个......

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

答案 1 :(得分:31)

我认为正确的方法是使用查询构建器表达式:

$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以外的数据库平台时会中断。

答案 2 :(得分:3)


    EDIT: See the other answers for better solutions

我提供的原始新手方法是(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'");

这很快捷,让原版海报立即上传。

因此接受了答案。

根据评论,这是错误的答案,但这是一个容易犯的错误,所以我把它留在这里作为“什么不该做!”

答案 3 :(得分:2)

看看我如何在参数中格式化我的日期$ jour。 这取决于你是否使用expr() - &gt; like或expr() - &gt; 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()
    ;