Выберите записи между датами в доктрине 2

Я с ума сойду с этой минимальной ошибкой, что я не получу исправления. Я хочу выбрать записи между двумя днями, приведенные ниже примеры иллюстрируют все мои неудачи:

opt 1.

$qb->where('e.fecha > ' . $monday->format('Ym-d')); $qb->andWhere('e.fecha < ' . $sunday->format('Ym-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 

Редактировать 1

Чтобы оценить sql, чтобы избежать сомнений, я выполнил этот запрос:

 $qb->where('e.fecha > ' . $sunday->format('Ym-d')); 

результат (3 записи):

 SELECT r0_.id_reservacion AS id_reservacion0, r0_.fecha AS fecha1, r0_.cliente AS cliente2 

Итак, похоже, что sql не проблема. ОТ резервирования r0_ WHERE r0_.fecha> 2012 – 07

Вы можете сделать …

 $qb->where('e.fecha BETWEEN :monday AND :sunday') ->setParameter('monday', $monday->format('Ym-d')) ->setParameter('sunday', $sunday->format('Ym-d')); 

или…

 $qb->where('e.fecha > :monday') ->andWhere('e.fecha < :sunday') ->setParameter('monday', $monday->format('Ym-d')) ->setParameter('sunday', $sunday->format('Ym-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 обрабатывать тип даты, поскольку он имеет уровень абстракции для работы с подобными вещами.

Если вы сделаете что-то вроде добавления строковой переменной в форме «Ymd», она сломается, когда она перейдет на платформу базы данных, отличную от MySQL.


     EDIT: см. Другие ответы для лучших решений

Первоначальный новичок, который я предложил, был (opt1):

 $qb->where("e.fecha > '" . $monday->format('Ym-d') . "'"); $qb->andWhere("e.fecha < '" . $sunday->format('Ym-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('Ym-d').'%') ->setParameter('jour2', $jour->format('Ym-d')) ->getQuery() ->getArrayResult() ; и $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('Ym-d').'%') ->setParameter('jour2', $jour->format('Ym-d')) ->getQuery() ->getArrayResult() ; и $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('Ym-d').'%') ->setParameter('jour2', $jour->format('Ym-d')) ->getQuery() ->getArrayResult() ;