Symfony2 datetime queryBuilder

时间:2012-02-29 05:24:09

标签: php doctrine symfony

我在Symfony2项目中有2个DateTime个类。我有实体 Stat ,其中包含 $ date 属性。

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

我必须使用 createQueryBuilder 中的 DateTime 对象进行查询。我怎样才能做到这一点 ?例如:

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

我需要在$ date_from和$ date_to之间获取表 stats (实体 Stat )中的所有行。我应该如何使用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 个答案:

答案 0 :(得分:31)

本杰明的回答是正确的,但缺少一个细节。 这是正确的方法:

$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类型,我会收到以下错误(请参阅here):

  

类DateTime的对象无法转换为字符串

我正在使用Doctrine DBAL 2.0.5,这种行为可能在更新版本的Doctrine中发生了变化。

答案 1 :(得分:8)

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-&gt; expr() - &gt;和X是有用的,如果你不想在添加一些andWhere或orWhere时有一些WTF。

Here you have doctrine2 documentation for queryBuilder

您还可以对参数使用setParameters方法

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

答案 2 :(得分:2)

我有类似的情况。由于我的代码是如何构建的,我无法使用 - &gt; setParameter,所以我把这个$和X变量“捕获”了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

         }

请注意,此函数的参数是多维数组。希望这有用。