DQLで日付関数とGROUP BY


DQLでDATEカラムをGROUP BYする方法がわからなかったので調べた

DoctrineExtensionを入れる

https://github.com/beberlei/DoctrineExtensions
でSQLの関数を追加

composer require beberlei/doctrineextensions

configs/packages/doctrine.yamlに追加

doctrine:
    orm:
        dql:
            string_functions:
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR: DoctrineExtensions\Query\Mysql\Year
                DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat

QueryBuilder

例えばNewsPostエンティティで記事がある年を取得する

NewsPostRepository

$qb = $this->createQueryBuilder('post')
    ->select('YEAR(post.post_date) AS year')
    ->groupBy('year')
    ->orderBy('post.post_date', 'DESC')
;
// array(
//    array(
//        'year' => 2022
//    ),
//    array(
//        'year' => 2021
//    )
// )

Group By 節に直接日付関数は使えない模様

$qb->groupBy('YEAR(post.post_date)');

とした時

[Semantical Error] line 0, col 59 near 'YEAR(post.post_date)': Error: Cannot group by undefined identification or result variable.

というエラーが出る。
select()で明示的に取得カラムにエイリアスをつけて、エイリアスでGroupByする様だ。