2012-05-21 30 views
11

Quiero obtener los elementos que se crearon hoy con un QueryBuilder de Doctrine2. Quiero comparar el campo createdAt (Datetime) con el parámetro today (Date). ¿Es posible hacer eso en una consulta?¿Cómo se puede comparar el campo de fecha y hora de Doctrine2 con una fecha?

$qb = $this->createQueryBuilder('i'); 
$qb->innerJoin('i.type', 'it'); 
$qb->andWhere('it.name = :type'); 
$qb->andWhere('i.createdAt < :today'); 
// i.createdAt == datetime and :today parameter is a date 

Respuesta

19

una idea es extraer de la fecha: año, mes y día. Y luego DÍA

$qb->select('p') 
    ->where('YEAR(p.postDate) = :year') 
    ->andWhere('MONTH(p.postDate) = :month') 
    ->andWhere('DAY(p.postDate) = :day'); 

$qb->setParameter('year', $year) 
    ->setParameter('month', $month) 
    ->setParameter('day', $day); 

mes y año de sacar los DoctrineExtensions de

por ejemplo,

DoctrineExtensions

Esto funciona para mí. Sólo necesita los archivos: day.php, month.php y year.php .....

que presentamos lo mejor mes por ejemplo:

$datetime = new \DateTime("now"); 
    $month = $datetime->format('m'); 
    echo $month; 

Copia day.php, month.php y año. php para su paquete Xy \ TestBundle \ DQL Registrar las nuevas funciones de aplicación \ config.yml con

doctrine: 


orm: 
    auto_generate_proxy_classes: %kernel.debug% 
    entity_managers: 
     default: 
      auto_mapping: true 
      dql: 
       datetime_functions: 
        month: Xy\TestBundle\Dql\Month 
        year: Xy\TestBundle\Dql\Year 
        day: Xy\TestBundle\Dql\Day 
+1

Está funcionando, pero está un poco sucio. ¿Sabe si se proporciona la función DATE() para QueryBuilder con este paquete? – gperriard

+1

@jooyce no hay. [Aquí] (https://github.com/simukti/DoctrineExtensions/tree/master/lib/DoctrineExtensions/Query/Mysql) es la lista de extensiones disponibles –

+0

Esto solo funciona para MySQL y Oracle ¿verdad? –

5

hay que añadir a su consulta QueryBuilder el parámetro today.

$today = new \DateTime(); 
$qb->setParameter('today', $today->format('Y-m-d')); 

Con el Generador de consultas, puede comparar las fechas para DateTime con el formato 'Y-m-d'

+0

traté de manejar con $ hoy-> formato ('Ym-d') como parámetro, pero no tengo resultado. Necesito obtener solo 'Y-m-d' para el campo 'createdAt'. – gperriard

+0

¿Ha intentado pasar directamente un objeto 'DateTime' como parámetro? – Florian

+0

Sí, pero ese no es el mismo valor (cuando los comparo tengo falso) y no es exactamente lo que haría. Me gustaría obtener artículos que fueron creados el mismo día, pero en cualquier momento. i.createdAt = 2012-05-21 13:18:27 $ today = 2012-05-21 14:23:34 – gperriard

13

es raro que tal ORM madura no proporciona la función DATE. Sin embargo, para obtener una fecha de un campo de fecha y hora, puede aplicar la función SUBSTRING así:

SELECT SUBSTRING(i.dateTimeField,1,10) FROM tableName i 

espero que ayude!

+0

¡Gracias por tu respuesta! ¡Ayuda mucho! –

+0

¡Tipo de solución hacky, hasta que la función DATE sea compatible con Doctrine! gracias ,, –

11

Hay una mejor opción que agregar la extensión de doctrina para la fecha.

primer lugar usted necesita para conseguir la puesta en fecha y hora y al final de fecha y hora:

$today_startdatetime = \DateTime::createFromFormat("Y-m-d H:i:s", date("Y-m-d 00:00:00")); 
$today_enddatetime = \DateTime::createFromFormat("Y-m-d H:i:s", date("Y-m-d 23:59:59")); 

Ahora los utilizan en consulta:

$em = \Zend_Registry::get('em'); 
$qb_1 = $em->createQueryBuilder(); 
$q_1 = $qb_1->select('wsh') 
    ->from('\Entities\wishes', 'wsh') 
    ->where('wsh.created_at >= :today_startdatetime') 
    ->andWhere('wsh.created_at <= :today_enddatetime'); 


$q_1->setParameter('today_startdatetime', $today_startdatetime); 
$q_1->setParameter('today_enddatetime', $today_enddatetime); 
$result= $q_1->getQuery()->getResult(); 
+0

mejor respuesta aquí! – Ian

+0

esta es una respuesta más directa. SAD que ORM no proporciona una función específica para esto – jrran90

10

También es posible utilizar la función incorporada de DATE_DIFF(date1, date2) que devuelve diferencia en días. Compruebe docs

$result = $this->createQueryBuilder('l') 
    ->where('DATE_DIFF(l.startDate, CURRENT_DATE()) = 0') 
2

Una solución fácil sería dar formato a la fecha y hora en consecuencia

public function getWithStartingPremium(\DateTime $datetime) 
{ 
    $qb = $this->createQueryBuilder('c'); 

    return $qb 
     ->innerJoin('c.collegePremium', 'cp') 
     ->where($qb->expr()->eq('cp.start', ':date')) 
     ->setParameters(array(
      'date' => $datetime->format('Y-m-d'), 
     )) 
     ->getQuery() 
     ->getResult(); 
} 
Cuestiones relacionadas