こんにちは、動作する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-0100:00:00を与えます。これは正しいです。
日付のマッピングは次のとおりです。
/**
* Date of the event.
* @Column(type="datetime")
*/
private $date;
助けてくれてありがとう!
パラメータで動作させることができなかったので、これが私が最終的に到達したものです:
$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");
クエリパラメータを使用してから、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();
あなたの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)));