【问题标题】:Symfony2 datetime queryBuilderSymfony2 日期时间查询生成器
【发布时间】:2012-03-18 15:16:07
【问题描述】:

我在 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();

【问题讨论】:

  • 你的代码不行吗?
  • 它有效...我在其他地方发现了问题

标签: php doctrine symfony


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

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 如果您不想在添加一些 andWhere 或 orWhere 时有一些 WTF,则很有用。

Here you have doctrine2 documentation for queryBuilder

你也可以使用 setParameters 方法来设置参数

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

【讨论】:

  • 我遇到了 date_from 和 date_to 都是同一天的问题,在这种情况下没有返回结果。问题是我使用的是 DateTime,所以它正在寻找当天的那一秒(mightnight)的结果。
【解决方案3】:

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

         }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2012-10-05
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多