Symfony2 datetime queryBuilder

two*_*e88 20 php doctrine symfony

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

/**
 * @ORM\Column(type="date", length="11")
 */
protected $date;
Run Code Online (Sandbox Code Playgroud)

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

$date_from = new DateTime('2012-02-01');
$date_to = new DateTime('2012-02-15');
Run Code Online (Sandbox Code Playgroud)

我需要从$ 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();
Run Code Online (Sandbox Code Playgroud)

Rau*_*ets 33

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

$qb->andWhere($qb->expr()->between('s.date', ':date_from', ':date_to'));
Run Code Online (Sandbox Code Playgroud)

但是要设置参数,我需要这样做:

$qb->setParameter('date_from', $date_from, \Doctrine\DBAL\Types\Type::DATETIME);
$qb->setParameter('date_to', $date_to, \Doctrine\DBAL\Types\Type::DATETIME);
Run Code Online (Sandbox Code Playgroud)

如果我省略DATETIME类型,我会收到以下错误(请参阅此处):

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

我使用的是Doctrine DBAL 2.0.5,在以后的Doctrine版本中,这种行为可能已经发生了变化.


Ben*_*cki 9

QueryBuilder是一个很好的解决方案.

但你可以使用

->andWhere($qb->expr()->between('s.date', ':date_from', 'date_to'))
Run Code Online (Sandbox Code Playgroud)

要么

->andWhere($qb->expr()->andX(array(
    $qb->expr()->gte('s.date', ':date_from'),
    $qb->expr()->lte('s.date', ':date_to'))
)
Run Code Online (Sandbox Code Playgroud)

$ qb-> expr() - >和X是有用的,如果你不想在添加一些andWhere或orWhere时有一些WTF.

这里有queryBuilder的doctrine2文档

您还可以使用setParameters方法作为参数

->setParameters(array(
    'date_from' => $date_from,
    'date_to'   => $date_to,
))
Run Code Online (Sandbox Code Playgroud)