Symfony2日期时间查询构建器

wbrvyc0a  于 2022-11-16  发布在  其他
关注(0)|答案(3)|浏览(140)

我在Symfony 2项目中有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');

我需要从表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();
wtlkbnrh

wtlkbnrh1#

本杰明的答案是正确的,但它缺少一个细节。

$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的后续版本中,此行为可能已更改。

pepwfjgg

pepwfjgg2#

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是有用的,如果你不想在添加andWhere或orWhere时出现一些WTF。
Here you have doctrine2 documentation for queryBuilder
您也可以使用setParameters方法作为参数

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

r6vfmomb3#

我也遇到过类似的情况。由于我的代码是如何构建的,我不能使用-〉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

         }

请注意,这个函数的参数是一个多维数组。希望这对您有所帮助。

相关问题