您好,我有一个有效的 DQL(我从一开始就得到了所有事件):
DoctrineHelper::getEntityManager()->createQueryBuilder()
->select("u.surname, count(u.surname) as total")
->from("User", "u")
->from("AbstractEvent", "e")
->from("Attendance", "a")
->where("u = a.attendee")
->andWhere("e = a.event")
->andWhere("a.status=1")
->andWhere("e.date<CURRENT_TIMESTAMP()")
->groupBy("u.email")
->orderBy("total","desc");
但是这个没有(我只想要这个月的活动):
DoctrineHelper::getEntityManager()->createQueryBuilder()
->select("u.surname, count(u.surname) as total")
->from("User", "u")
->from("AbstractEvent", "e")
->from("Attendance", "a")
->where("u = a.attendee")
->andWhere("e = a.event")
->andWhere("a.status=1")
->andWhere("e.date<CURRENT_TIMESTAMP()")
->andWhere("e.date>?", date('Y-m-d 00:00:00', strtotime('-'.(date('j')-1).' day')) )
->groupBy("u.email")
->orderBy("total","desc");
我的 error.log 有这一行:
#0 /var/www/Doctrine/ORM/Query/AST/InputParameter.php(46): Doctrine\\ORM\\Query\\QueryException::invalidParameterFormat('?')
日期的 print_r 给了我:2011-08-01 00:00:00 这是正确的。
这是日期的映射:
/**
* Date of the event.
* @Column(type="datetime")
*/
private $date;
任何帮助表示感谢!
使用查询参数,然后将 DateTime 对象设置为参数的值。然后 Doctrine 将自动处理转换。
这是我自己项目中的示例代码
$builder = $this->getEntityManager()->createQueryBuilder();
$builder->select('a')
->from('MaggotsLeadGeneratorBundle:JobApplication', 'a')
;
$and = $builder->expr()->andX();
if ($dateFrom) {
$and->add($builder->expr()->gt('a.ctime', ':dateFrom'));
$builder->setParameter('dateFrom', $dateFrom);
}
if ($dateTo) {
$and->add($builder->expr()->lt('a.ctime', ':dateTo'));
$builder->setParameter('dateTo', $dateTo);
}
$builder->where($and);
$query = $builder->getQuery();
$result = $query->getResult();
不能让它与参数一起工作,所以这就是我最后得到的:
$now = new DateTime;
$now->modify( '-'.(date('j')-1).' day' );
$qb = DoctrineHelper::getEntityManager()->createQueryBuilder()
->select("u.surname, count(u.surname) as total")
->from("User", "u")
->from("AbstractEvent", "e")
->from("Attendance", "a")
->where("u = a.attendee")
->andWhere("e = a.event")
->andWhere("a.status=1")
->andWhere("e.date<CURRENT_TIMESTAMP()")
->andWhere("e.date > '".$now->format("Y-m-d H:i:s")."'")
->groupBy("u.email")
->orderBy("total","desc");
我认为这可能是因为你的
e.date
被映射为 datetime
。尝试传递 DateTime 对象而不是时间戳。
//...
->andWhere("e.date>?", new DateTime("2011-08-01 00:00:00"))
//...
请发布您的实体映射,这将有助于澄清错误的根源。
更新:奇怪......也许这会起作用:
->andWhere("e.date>'?'", new DateTime("2011-08-01 00:00:00")->format("Y-m-d H:i:s"))
对我来说,这个方法很有效,可以在过去 30 分钟内获得所有结果:
$qb = $em->createQueryBuilder();
$qb->select('u')
->from('User', 'u')
->where('u.group = '.$this->group->getId())
->andWhere("u.createdAt > :date")
->setParameter('date', new \DateTime(date("F d Y H:i:s", time() - 30*60)));
我在使用
setParameter
和 DateTime
对象时遇到了类似的问题。一些搜索让我找到了这个旧的错误报告......
https://github.com/doctrine/orm/issues/8113
注意作者提到了
setParameter
的第三个论点。当我设置实体时,控制台将列类型设置为 Types::DATE_MUTABLE
,所以我认为这将是一个合理的参数。这对我有用:
->setParameter('mydate', $myDateTime, Types::DATE_MUTABLE)
注意类常量
Types::DATE_MUTABLE
只是 'date'
的别名,所以我将代码更改为如下所示:
->setParameter('mydate', $myDateTime, 'date')
删除第三个值会导致我的查询返回
null
,没有错误。