Seleccionar entradas entre fechas en la doctrine 2

Voy a volverme loco con este error mínimo de que no obtendré una solución. Quiero seleccionar entradas entre dos días, los ejemplos a continuación ilustran todos mis errores:

opt 1

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

resultado (0 entradas):

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

resultado (0 entradas):

 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 

Esta es mi tabla con las entradas actuales:

 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 

Editar 1

Con el fin de evaluar el sql para evitar dudas, ejecuté esta consulta:

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

resultado (3 entradas):

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

Entonces, parece que el sql no es el problema. DESDE reservacion r0_ DONDE r0_.fecha> 2012 – 07

Puedes hacer cualquiera …

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

o…

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

Creo que la forma correcta de hacerlo sería usar expresiones de generador de consultas:

 $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

Editar: La ventaja que tiene este método sobre cualquiera de las otras respuestas aquí es que es independiente del software de la base de datos: debe dejar que Doctrine maneje el tipo de fecha, ya que tiene una capa de abstracción para tratar este tipo de cosas.

Si hace algo así como agregar una variable de cadena en el formato ‘Ymd’, se romperá cuando vaya a una plataforma de base de datos que no sea MySQL, por ejemplo.


     EDITAR: Vea las otras respuestas para mejores soluciones

Los enfoques novatos originales que ofrecí fueron (opt1):

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

Y (opt2):

 $qb->add('where', "e.fecha between '2012-01-01' and '2012-10-10'"); 

Eso fue rápido y fácil, y consiguió que el póster original funcionara de inmediato.

De ahí la respuesta aceptada.

Según los comentarios, es la respuesta incorrecta, pero es un error fácil de hacer, así que lo dejo aquí como “¡qué no hacer!”

Mira cómo formateo mi fecha $ jour en los parámetros. Depende si usa un expr () -> like o un 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() ;