web-dev-qa-db-fra.com

Sélectionnez les entrées entre les dates dans doctrine 2

Je vais devenir fou avec cette erreur minimale que je ne reçois pas de solution. Je veux sélectionner des entrées entre deux jours, les exemples ci-dessous illustrant tous mes échecs:

opt 1.

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

résultat (0 entrées):

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

résultat (0 entrées):

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

Ceci est ma table avec les entrées actuelles:

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

Edit 1

Afin d'évaluer le SQL pour éviter les doutes, j'ai lancé cette requête:

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

résultat (3 entrées):

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

Donc, on dirait que le SQL n'est pas le problème. DE reservacion r0_ WHERE r0_.fecha> 2012 - 07

48
manix

Vous pouvez faire soit…

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

ou…

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

Je pense que la bonne façon de procéder consiste à utiliser des expressions du générateur de requêtes:

$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

Edit: L’avantage de cette méthode par rapport à l’une des réponses est qu’elle est indépendante du logiciel de base de données - vous devez laisser Doctrine gérer le type de date car il possède une couche d’abstraction pour traiter ce type de chose.

Si vous faites quelque chose comme ajouter une variable de chaîne sous la forme 'Y-m-d', elle se brisera lorsqu'elle passe sur une plateforme de base de données autre que MySQL, par exemple.

32

 
 EDIT: Voir les autres réponses pour de meilleures solutions 
 

Les approches originales pour les débutants que j'ai proposées sont (opt1):

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

Et (opt2):

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

Cela a été rapide et facile et l’affiche originale a été lancée immédiatement.

D'où la réponse acceptée.

Selon les commentaires, ce n'est pas la bonne réponse, mais c'est une erreur facile à faire, alors je le laisse ici comme un "quoi ne pas faire!"

3
azhrei

Regardez comment je formate ma date $ jour dans les paramètres. Cela dépend si vous utilisez un expr () -> like ou 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()
    ;
1
Laurent Lolo