php - type - symfony datetime now
Symfony2 datetime queryBuilder (3)
La respuesta de Benjamin es correcta, pero le falta un detalle. Esta es la forma correcta de hacerlo:
$qb->andWhere($qb->expr()->between(''s.date'', '':date_from'', '':date_to''));
Pero para establecer parámetros, necesito hacer esto:
$qb->setParameter(''date_from'', $date_from, /Doctrine/DBAL/Types/Type::DATETIME);
$qb->setParameter(''date_to'', $date_to, /Doctrine/DBAL/Types/Type::DATETIME);
Si omito los tipos DATETIME, obtengo el siguiente error (vea here ):
Objeto de la clase DateTime no se pudo convertir a cadena
Estoy usando Doctrine DBAL 2.0.5, este comportamiento podría haber cambiado en versiones posteriores de Doctrine.
Tengo 2 clases de DateTime en el proyecto Symfony2. Tengo entidad Stat , en la que tengo propiedad $ date .
/**
* @ORM/Column(type="date", length="11")
*/
protected $date;
Tengo que hacer consultas usando objetos DateTime en createQueryBuilder . Cómo puedo hacer eso ? Por ejemplo:
$date_from = new DateTime(''2012-02-01'');
$date_to = new DateTime(''2012-02-15'');
Necesito obtener todas las filas de las estadísticas de la tabla (entidad Stat ) entre $ date_from y $ date_to. ¿Cómo debo escribir mi consulta con createQueryBuilder? Mi código actual es:
$qb = $em->createQueryBuilder();
$query = $qb->select(''s'')
->from(''ACME/MyBundle/Entity/Stat'', ''s'')
->where(''s.date >= :date_from'')
->andWhere(''s.date <= :date_to'')
->setParameter(''date_from'', $date_from)
->setParameter(''date_to'', $date_to)
->getQuery();
Tuve una situación similar. No pude usar -> setParameter debido a cómo se construyó mi código, así que puse esta variable $ yX para "capturar" todas las condiciones encontradas en el bucle foreach (en este caso, solo escribí una con las fechas porque otras no relevante en este momento).
$this->qb = $this->em->createQueryBuilder();
$andX = $this->qb->expr()->andX();
$this->qb->select(''u'')
->from(''models/User'',''u'');
foreach($data as $key=>&$value){
if($key == ''date''){
$from = $this->qb->expr()->gte(''u.date_from'',$this->qb->expr()->literal($value[''datefrom'']));
$to = $this->qb->expr()->lte(''u.date_to'',$this->qb->expr()->literal($value[''dateto'']));
$condition = $from. '' AND '' .$to;
$andX->add($condition);
}
//other if
}
Observe que el parámetro para esta función es una matriz multidimensional. Espero que esto sea de ayuda.
Un QueryBuilder es una buena solución.
Pero puedes usar
->andWhere($qb->expr()->between(''s.date'', '':date_from'', ''date_to''))
o
->andWhere($qb->expr()->andX(array(
$qb->expr()->gte(''s.date'', '':date_from''),
$qb->expr()->lte(''s.date'', '':date_to''))
)
El $ qb-> expr () -> yX es útil si no desea tener algo de WTF cuando agrega algunos yWhere o or Where.
Aquí tienes la documentación de doctrine2 para queryBuilder.
También puedes usar el método setParameters para tus parámetros
->setParameters(array(
''date_from'' => $date_from,
''date_to'' => $date_to,
))