Symfony2 datetime queryBuilder

У меня есть 2 класса DateTime в проекте Symfony2. У меня есть объект Stat , в котором есть свойство $ date .

/** * @ORM\Column(type="date", length="11") */ protected $date; 

Я должен делать запросы с использованием объектов DateTime в createQueryBuilder . Как я могу это сделать ? Например:

 $date_from = new DateTime('2012-02-01'); $date_to = new DateTime('2012-02-15'); 

Мне нужно получить все строки из статистики таблицы (entity Stat ) между $ date_from и $ date_to. Как написать мой запрос с помощью createQueryBuilder? Мой текущий код:

 $qb = $em->createQueryBuilder(); $query = $qb->select('s') ->from('ACME\MyBundle\Entity\Stat', 's') ->where('s.date >= :date_from') ->andWhere('s.date <= :date_to') ->setParameter('date_from', $date_from) ->setParameter('date_to', $date_to) ->getQuery(); 

Ответ Бенджамина верен, но ему не хватает одной детали. Это правильный способ сделать это:

 $qb->andWhere($qb->expr()->between('s.date', ':date_from', ':date_to')); 

Но для установки параметров мне нужно сделать вот так:

 $qb->setParameter('date_from', $date_from, \Doctrine\DBAL\Types\Type::DATETIME); $qb->setParameter('date_to', $date_to, \Doctrine\DBAL\Types\Type::DATETIME); 

Если я опускаю типы DATETIME, я получаю следующую ошибку (см. Здесь ):

Объект класса DateTime не может быть преобразован в строку

Я использую Doctrine DBAL 2.0.5, это поведение, возможно, изменилось в более поздних версиях Doctrine.

QueryBuilder – хорошее решение.

Но вы можете использовать

 ->andWhere($qb->expr()->between('s.date', ':date_from', 'date_to')) 

или

 ->andWhere($qb->expr()->andX(array( $qb->expr()->gte('s.date', ':date_from'), $qb->expr()->lte('s.date', ':date_to')) ) и ->andWhere($qb->expr()->andX(array( $qb->expr()->gte('s.date', ':date_from'), $qb->expr()->lte('s.date', ':date_to')) ) 

$ Qb-> expr () -> andX полезен, если вы не хотите иметь некоторую WTF, когда вы добавляете someWhere или orWhere.

Здесь у вас есть документация doctrine2 для queryBuilder

Вы также можете использовать метод setParameters для своих параметров

 ->setParameters(array( 'date_from' => $date_from, 'date_to' => $date_to, )) 

У меня была аналогичная ситуация. Я не мог использовать -> setParameter из-за того, как был создан мой код, поэтому я помещал эту переменную $ andX в «улавливать» все условия, созданные в цикле foreach (в этом случае я просто написал одно с датами, потому что другие не имеет значения прямо сейчас).

  $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 } 

Обратите внимание, что параметр для этой функции является многомерным массивом. Надеюсь, это полезно.