2012-05-21 16 views
11

Voglio ottenere gli oggetti che sono stati creati oggi con un QueryBuilder da Doctrine2. Voglio confrontare il campo createdAt (Datetime) con il parametro today (Date). È possibile farlo in una query?Come confrontare il campo data/ora di Doctrine2 con una data?

$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 

risposta

19

uno idea è quella di estrarre dalla data: anno, mese e giorno. E poi

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

MESE giorno e l'anno si prende i DoctrineExtensions da

esempio

DoctrineExtensions

questo funziona per me. Hai solo bisogno dei file: day.php, month.php e year.php .....

si ottiene il mese esempio:

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

Copia day.php, month.php e anno. php per il vostro pacco Xy \ TestBundle \ DQL Registrati le nuove funzioni in App \ 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

Funziona, ma è un po 'sporco. Sai se la funzione DATE() per QueryBuilder è fornita con questo pacchetto? – gperriard

+1

@jooyce non c'è. [Qui] (https://github.com/simukti/DoctrineExtensions/tree/master/lib/DoctrineExtensions/Query/Mysql) è l'elenco delle estensioni disponibili –

+0

Questo funziona ancora solo per MySQL e Oracle, giusto? –

5

si deve aggiungere alla tua richiesta QueryBuilder il parametro today.

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

Con il QueryBuilder, è possibile confrontare le date per DateTime con il formato 'Y-m-d'

+0

ho cercato di gestire con $ oggi-> format ('Ym-d') come parametro, ma non c'ho risultato. Devo solo ottenere 'Y-m-d' per il campo 'createdAt'. – gperriard

+0

Hai provato a passare direttamente un oggetto 'DateTime' come parametro? – Florian

+0

Sì, ma non è lo stesso valore (quando li ho confrontati ho falsi) e non è esattamente quello che vorrei. Vorrei ottenere oggetti creati nello stesso giorno, ma in qualsiasi momento. i.createdAt = 2012-05-21 13:18:27 $ today = 2012-05-21 14:23:34 – gperriard

13

E 'raro che un tale ORM maturo non fornisce la funzione di DATE. Tuttavia, per ottenere una data di un campo datetime, è possibile applicare la funzione SUBSTRING in questo modo:

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

Speranza che aiuta!

+0

Tks per te ha risposto! Aiuta molto! –

+0

Tipo di correzione hacky, finché la funzione DATE non è supportata da Doctrine! grazie ,, –

11

C'è un'opzione migliore dell'aggiunta dell'estensione di doctrine per la data.

In primo luogo è necessario ottenere start-datetime e di fine-datetime:

$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")); 

Ora li usano in query:

$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

migliore risposta qui intorno! – Ian

+0

questa è una risposta più diretta. SAD che ORM non fornisce una funzione specifica per questo – jrran90

10

E 'anche possibile utilizzare la funzione incorporata DATE_DIFF(date1, date2) che restituisce differenza in giorni. Controllare docs

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

Una soluzione semplice sarebbe quella di formattare il datetime di conseguenza

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(); 
} 
Problemi correlati