Comment utiliser "intervalle" dans Doctrine2 Générateur de Requêtes
Dans mon Symfony2 référentiel, j'aimerais obtenir des objets à partir d'un calendrier de table, qui ont commencé, mais pas encore terminé. L'intervalle, dans les objets doivent être rencontrées comme "pas fini", doit être passé comme une variable.
À l'aide de la plaine SQL, il fonctionne comme ceci:
SELECT * FROM slots rbs
WHERE rbs.rundate = '2012-08-13'
AND rbs.runtime <= '11:05:00'
AND '11:05:00' <= rbs.runtime + interval '300 seconds'
ORDER BY rbs.rundate DESC, rbs.runtime DESC
Puis-je obtenir le même avec DQL /Query Builder?
C'est ce que j'ai à ce jour:
$qb = $this->createQueryBuilder('rbs');
$qb->where(
$qb->expr()->andX(
$qb->expr()->eq('rbs.rundate', ':date'),
$qb->expr()->lte('rbs.runtime', ':time'),
'rbs.runtime + interval 300 seconds >= :time'
)
)
->orderBy('rbs.rundate', 'DESC')
->addOrderBy('rbs.runtime', 'DESC')
->setParameter('date', date('Y-m-d'))
->setParameter('time', date('H:i:s'))
Mais cela renvoie l'erreur suivante:
[Doctrine\ORM\Query\QueryException]
[Syntax Error] line 0, col 139: Error: Expected =, <, <=, <>, >, >=, !=, got '300'
J'ai trouvé que "intervalle" n'est pas pris en charge par Doctrine2 /DQL, qui est également mentionné ici.
Des suggestions sur la façon d'accomplir ceci avec Doctrine2 du Générateur de Requête ou DQL (et en passant à l'intervalle de la variable)?
OriginalL'auteur mediafreakch | 2012-08-13
Vous devez vous connecter pour publier un commentaire.
Autant que je sache, l'Intervalle n'est pas porté dans la Doctrine. La solution de contournement que j'ai trouvé est de travailler directement sur le DateTime je passe comme un paramètre (ici, je voudrais utiliser l'intervalle de 2 jours, passé à travers Datetime):
->where('rbs.runtime <= :now') ->andWhere('rbs.runtime >= :xbefore') ->setParameter('now', new \DateTime()) ->setParameter('xbefore', new \DateTime('-300 seconds')
Vous pouvez même remplacer la valeur codée en dur pour \DateTime avec une variable:new \DateTime('-'.$tolerance.' seconds')
Nice one, un plaisir de vous aider 😉
Elle fonctionne. Que penser de l'utilisation de la valeur de la colonne que le décalage de l'heure? Quelque chose comme
->setParameter('begin', new \DateTime('+e.timeOffset days'))
. Comment puis-je y parvenir?Un grand nombre des mêmes fonctions que vous utilisez INTERVALLE dans PgSQL vous pouvez réécrire avec la Doctrine du DQL fonctions: DATE_ADD(), DATE_SUB(), DATE_DIFF() -- découvrez CURRENT_DATE(), CURRENT_TIME(), et CURRENT_TIMESTAMP (). Voilà comment j'ai résolu le problème. Si vous creusez dans la Doctrine de code, DQL utilise psql intervalles pour ce faire.
OriginalL'auteur guillaumepotier
Si vous souhaitez utiliser un INTERVALLE de Doctrine 2, DQL) sur mysql comumn champ, Vous pouvez utiliser en tant que ci-dessous,
Il permet d'imprimer SQL comme ci-dessous,
OriginalL'auteur Kiran
@Kiran écrire uniquement sur
DATE_ADD
, mais vous pouvez également utiliserDATE_SUB
C'est l'équivalent de SQL:
OriginalL'auteur Serhii Popov