Symfony2 datetime queryBuilder

2022-08-30 20:33:17

我在Symfony2项目中有2个DateTime类。我有实体统计,其中有$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之间的所有行。我应该如何使用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();

答案 1

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

$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 的更高版本中可能已经改变。


答案 2

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是有用的,如果你不想在添加一些和Where或where时有一些WTF。

在这里,您有用于查询构建器的 doctrine2 文档

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

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

推荐