我在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();
答案 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
}
请注意,此函数的参数是多维数组。希望这有用。