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
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
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'));
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.
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!"
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()
;