Я с ума сойду с этой минимальной ошибкой, что я не получу исправления. Я хочу выбрать записи между двумя днями, приведенные ниже примеры иллюстрируют все мои неудачи:
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
Чтобы оценить 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() ;