Symfony2 datetime queryBuilder
j'en ai 2 DateTime classes dans le projet Symfony2. J'ai l'entité Stat, où $date propriété.
/**
* @ORMColumn(type="date", length="11")
*/
protected $date;
je dois faire des requêtes en utilisant DateTime objets createQueryBuilder. Comment puis-je le faire ? Par exemple:
$date_from = new DateTime('2012-02-01');
$date_to = new DateTime('2012-02-15');
j'ai besoin d'obtenir toutes les lignes de la table statistiques (entity Stat) entre $ date_fr de et $date_to. Comment dois-je écrire ma requête avec createQueryBuilder ? Mon code est:
$qb = $em->createQueryBuilder();
$query = $qb->select('s')
->from('ACMEMyBundleEntityStat', 's')
->where('s.date >= :date_from')
->andWhere('s.date <= :date_to')
->setParameter('date_from', $date_from)
->setParameter('date_to', $date_to)
->getQuery();
3 réponses
la réponse de Benjamin est correcte, mais il manque un détail. C'est la bonne façon de le faire:
$qb->andWhere($qb->expr()->between('s.date', ':date_from', ':date_to'));
mais pour définir les paramètres, je dois faire comme ceci:
$qb->setParameter('date_from', $date_from, \Doctrine\DBAL\Types\Type::DATETIME);
$qb->setParameter('date_to', $date_to, \Doctrine\DBAL\Types\Type::DATETIME);
si j'Omets les types DATETIME, j'obtiens l'erreur suivante (voir ici):
objet de la classe DateTime ne pouvait pas être converti en string
j'utilise la Doctrine DBAL 2.0.5, ce comportement pourrait avoir changé dans les versions suivantes de Doctrine.
un QueryBuilder est une bonne solution.
Mais vous pouvez utiliser
->andWhere($qb->expr()->between('s.date', ':date_from', 'date_to'))
ou
->andWhere($qb->expr()->andX(array(
$qb->expr()->gte('s.date', ':date_from'),
$qb->expr()->lte('s.date', ':date_to'))
)
$qb->expr()->andX est utile si vous ne voulez pas avoir certains WTF lorsque vous ajoutez un peu et où ou orWhere.
ici vous avez doctrine2 documentation pour queryBuilder
vous pouvez également utiliser la méthode setParameters pour vos paramètres
->setParameters(array(
'date_from' => $date_from,
'date_to' => $date_to,
))
j'ai eu une situation similaire. Je ne pouvais pas utiliser ->setParameter en raison de la façon dont mon code a été construit, donc j'ai mis cette variable $andX pour "attraper" toutes les conditions fondées dans la boucle foreach (dans ce cas, j'ai juste écrit celle avec les dates parce que les autres ne sont pas pertinents en ce moment).
$this->qb = $this->em->createQueryBuilder();
$andX = $this->qb->expr()->andX();
$this->qb->select('u')
->from('models\User','u');
foreach($data as $key=>&$value){
if($key == 'date'){
$from = $this->qb->expr()->gte('u.date_from',$this->qb->expr()->literal($value['datefrom']));
$to = $this->qb->expr()->lte('u.date_to',$this->qb->expr()->literal($value['dateto']));
$condition = $from. ' AND ' .$to;
$andX->add($condition);
}
//other if
}
Notez que le paramètre de cette fonction est un tableau multidimensionnel. Espérons que cela est utile.