DQLではMySQLのDATE_FORMATが使えないので生クエリを発行してみた。
例えばブログなどの投稿記事を男女別、日別でカウントを取りたいとすると
雰囲気下記のような感じになる。
// ファイルの先頭で宣言
use Hoge\FugaBundle\Entity\Post;
use Doctrine\ORM\Query\ResultSetMapping;
...
// 関数内
$em = $this->getDoctrine()->getManager();
// 何日前の投稿分まで集計するか
$pastRange = date('Y-m-d', strtotime('-16 days'));
$sql = "select date_format(p.createdAt, '%Y-%m-%d') as date, p.sex as sex, count(p.id) as cnt from posts as p where p.deletedAt is null and p.status in (1, 2) and p.createdAt >= ?
group by date, sex";
$rsm = new ResultSetMapping();
$rsm->addEntityResult('HogeFugaBundle:Post', 'p');
$rsm->addScalarResult('date', 'date');
$rsm->addScalarResult('sex', 'sex');
$rsm->addScalarResult('cnt', 'cnt');
$query = $em->createNativeQuery($sql, $rsm);
$query->setParameter(1, $pastRange);
// FOSRestBundleを用いてjsonでレスポンスを返却する。
$view = $this->view($query->getResult(), 200)->setFormat('json');
return $this->handleView($view);
これでDQLに無い関数も利用出来るようになった。
おまけ。曜日、時間帯、男女別ごとにカウントを取るSQL。
$sql = "select date_format(p.createdAt, '%w') as day, date_format(p.createdAt, '%H') as hour, p.sex as sex, count(p.id) as cnt from posts as p where p.deletedAt is null and p.status
in (1, 2) and p.createdAt >= ? group by day, hour, sex";
$rsm = new ResultSetMapping();
$rsm->addEntityResult('HogeFugaBundle:Post', 'p');
$rsm->addScalarResult('day', 'day');
$rsm->addScalarResult('hour', 'hour');
$rsm->addScalarResult('sex', 'sex');
$rsm->addScalarResult('cnt', 'cnt');
うん。楽しい。
createNativeQuery()の詳細は下記公式を参照されたし。
http://doctrine-orm.readthedocs.org/en/latest/reference/native-sql.html