querybuilder query inner andwhere php date doctrine2 between query-builder

php - query - Seleccionar entradas entre fechas en la doctrina 2



symfony doctrine querybuilder (4)

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.

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


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(''Y-m-d'').''%'') ->setParameter(''jour2'', $jour->format(''Y-m-d'')) ->getQuery() ->getArrayResult() ;


Puedes hacer cualquiera ...

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

o…

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


EDIT: See the other answers for better solutions

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

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