Symfony2 datetime queryBuilder - PullRequest
       21

Symfony2 datetime queryBuilder

20 голосов
/ 29 февраля 2012

У меня есть 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');

Мне нужно получить все строки из таблицы stats (сущность 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();

Ответы [ 3 ]

31 голосов
/ 12 марта 2013

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

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

8 голосов
/ 31 мая 2012

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

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

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

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

->setParameters(array(
    'date_from' => $date_from,
    'date_to'   => $date_to,
))
2 голосов
/ 05 ноября 2013

У меня была похожая ситуация.Я не смог использовать -> 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

         }

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

...